无法从ArrayList中找到项目?

时间:2013-12-21 04:47:41

标签: java object arraylist

我似乎无法将我保存的帐户存储在ArrayList中。我认为最新的一个覆盖了最旧的一个,但我需要它们全部堆叠在ArrayList中。

当我运行程序时,我创建(添加到ArrayList)一个新帐户,比如Greg。然后我继续使用该帐户,稍后再添加另一个帐户,鲍勃说。然后我点击“搜索帐户”并输入Greg,它找不到它,但它找到了Bob。但是,如果我在创建Bob之前搜索Greg,它会发现它!

以下是我的代码的相关部分:

////////// DECLARATIONS /////////
public static ArrayList dataStore;
public static int       index;
dataStore = new ArrayList(10);
index     = 0;

/////////////////////////////// ADD NEW ACCOUNT ////////////////////////////////
    else if(source.equals("Add new account")) {
//*************         Output
        accountName = JOptionPane.showInputDialog("Enter the account name: ");
        account.setName(accountName);

        String strInitialBalance = JOptionPane.showInputDialog("Enter your initial
        balance: ");
        initialBalance = Double.parseDouble(strInitialBalance);
        account.setBalance(initialBalance);

        account = new CheckingAccount(initialBalance, accountName);
        dataStore.add(index++, account);

    }

//////////////////////////////// FIND ACCOUNT /////////////////////////////////
    else if(source.equals("Find an account")) {
        String str, name;

        str = JOptionPane.showInputDialog("Enter the Account name: ");

        for (int index = 0; index < dataStore.size(); index++) {
            Account datum = (Account)dataStore.get(index);

            if (str.equals(datum.getName())) {
                name = datum.getName();
                textArea.setText("Found Account for " + name);
            }
            else
                textArea.setText("No Accounts found!");

        } // for

    }

他们所指的这个“帐户”对象是我所有存储所有数据的类。这是它的标题:

public class CheckingAccount extends Account implements Serializable {
// ...
// Methods
// ...
}

1 个答案:

答案 0 :(得分:2)

这是您原始的代码块。

for (int index = 0; index < dataStore.size(); index++) {
        Account datum = (Account)dataStore.get(index);

        if (str.equals(datum.getName())) {
            name = datum.getName();
            textArea.setText("Found Account for " + name);
        }
        else
            textArea.setText("No Accounts found!");

    }

我认为在for循环中使用else语句是有意义的,请尝试下面的代码......

boolean found = false;
for (int index = 0; index < dataStore.size(); index++) {
        Account datum = (Account)dataStore.get(index);

        if (str.equals(datum.getName())) {
            name = datum.getName();
            textArea.setText("Found Account for " + name);
            found = true;
        }
    }
 if(!found){

     textArea.setText("No Accounts found!");
 }

我认为您不希望else{}中的for(...) loop,因为当您浏览数据结构时,很多时候,您的初始if (str.equals(datum.getName()))语句会失败,因为您没有找到了帐户。但是,如果您最终找到它,则会遇到if(...)条件并通过textArea告知用户您找到了该帐户。然后将boolean设置为true,即可找到它。如果你通过整个数据结构并且没有找到它,那么布尔值仍将等于false,并且你将满足第二个条件,如果在for循环之后是if(!found),并告诉用户您已搜索整个数据结构但尚未找到该帐户。

另外,我认为你的第一个看起来应该更像下面的代码(我不知道CheckAccount的签名方法是什么样的,所以这有点是对实际语法的猜测)

else if(source.equals("Add new account")) {
//*************         Output
    //use constructor below if you have a default constructor aka no paramaters
    CheckingAccount account = new CheckingAccount();
    //now that you have object linked to account, you can use setters
    accountName = JOptionPane.showInputDialog("Enter the account name: ");
    //set the name
    account.setName(accountName);

    String strInitialBalance = JOptionPane.showInputDialog("Enter your initial
    balance: ");
    initialBalance = Double.parseDouble(strInitialBalance);
    //set the balance
    account.setBalance(initialBalance);

    //dont make a new object now as you did before..just add the object to your arraylist
    dataStore.add(index++, account);

}