新手努力从arraylist中删除对象

时间:2014-11-11 21:40:35

标签: java arraylist

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

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

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

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

public boolean removeAccount(String AccountNumber)

{   

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

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

然而,这不起作用。

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

有什么想法吗?

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

3 个答案:

答案 0 :(得分:1)

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

这应该适合你:

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阅读更多信息。

答案 1 :(得分:1)

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

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

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

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

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++可以如果你不小心,请跳过一个。但我假设最多只有一个帐号有一个帐号。]

答案 2 :(得分:0)

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

它不应该是您Account课程的一种方法,因为该课程不应该对您的列表有任何了解(因此,accounts变量不应该是该成员的一部分类)。如果您同时传递了帐号和列表,它可能是Account的静态方法,但这不是您正在做的事情。

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