关于java:新手努力从arraylist中删除对象

Newbie struggling removing objects from arraylist

我需要在其自己的类实例中根据其变量删除元素。

我有一个名为Account的类,以及一个名为AccountList的ArrayList。据我所知,有两种方法可以从数组中删除元素:通过索引和使用Object 0方法。

不幸的是,这些都不适合我;我需要删除一个对象,如果它的变量值为"accountNumber"(来自Account类)等于用户输入的AccountNumber的参数值。我的导师想要一个带有名为Account Number的String参数的布尔方法。

我的方法是使用Account类的getAccNumber() getter方法,如果它等于参数,则删除它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public boolean removeAccount(String AccountNumber)

{  

    if (AccountNumber.equals(Account.getAccNumber()))
    {

        accounts.remove(AccountNumber);
        return true;
    }
    else
    {
        return false;
    }
}

但是,这不起作用。

顺便说一句,我必须使getAccNumber()方法静态以允许ArrayList类访问。这搞砸了账户的实例;如果我创建它的新实例,新的AccountNumber值将覆盖前一个。

有任何想法吗?

编辑...他的确切规范"removeAccount(String)如果帐户存在,则应删除指定为参数的帐号的帐户。然后应通过BlueJ'方法结果'对话框返回相应的布尔值。"


在Java 8中,如何在没有任何迭代的情况下执行此操作:

1
accounts.removeIf(account -> accountNumber.equals(account.getAccNumber()));

如果删除了某些内容,则此表达式返回true,否则返回false

如果你不能使用Java 8:我不确定你是什么,不允许使用。如果你可以使用循环,但你不能使用Iterator或增强的for循环(for Account acc : accounts),它通过暗示使用迭代器,你可以使用索引编写一个循环:

1
2
3
4
5
6
for (int i = 0; i < accounts.size(); i++) {
    if (accountNumber.equals(accounts.get(i).getAccNumber())) {
        accounts.remove(i);
        break;
    }
}

这将查找具有匹配索引的帐户的索引,然后使用remove(index)方法将其删除。 [请注意,如果需要删除多个方法,则必须修改此方法,因为remove(i)方法会移动元素i后面的元素的所有索引,这意味着如果你的话,i++可以跳过一个不小心。但我假设最多只有一个帐号有一个帐号。]


您不需要将accountNumber设置为静态,而是通过帐户列表循环并读取每个帐号并进行比较。

这应该是你的诀窍:

1
2
3
4
5
6
7
8
9
10
11
12
public boolean removeAccount(String accountNumber)
{  
    return accounts.remove(getAccountByName(accountNumber));
}

public Account getAccountByName(String accountNumber){
     for(Account acc: accounts){
         if(accountNumber.equals(acc.getAccNumber())){
             return acc;
         }
     }    
}

你有这种方式,你将达到一个状态,你可以得到更多的ConcurrentModificationException。


基本上,您必须遍历列表,直到找到要删除的元素,然后将其删除。有几种方法可以实现细节,但是如果你使用的是标准java.util.ArrayList,那么我建议使用它的迭代器。没有什么能阻止你将这个操作包装在一个方法中,但是你似乎对于哪个类应该有removeAccount()方法感到困惑。

它不应该是Account类的方法,因为该类不应该知道您的列表(特别是accounts变量不应该是该类的成员)。如果您同时传递了帐号和列表,它可能是Account的静态方法,但这不是您正在做的事情。

相反,您需要将方法放在accounts变量所属的类上,或者放在该类的内部类上,否则您的方法无法访问该列表。在你的级别,你不应该试图找出内部类,这样就会留下accounts所属的类。