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'方法结果'对话框返回相应的布尔值。"
-
accounts的类型是什么?
-
使用Iterator循环遍历数组列表的内容。 Iterator接口中有一个remove()方法,允许您在循环时安全地删除条目。
-
还有另外一种方法吗?我知道你是完全正确但我知道它不是我的导师所寻找的:(我可以使用for或while循环做类似的事情吗?
-
accounts是我的arraylist的名字,很抱歉忘记了!
-
Account.getAccNumber()帐户未在任何地方定义
-
还有很多其他方法。但是,如果不知道你的任务有什么限制,我猜不出哪些是你能接受的。
-
@ Dave95如何定义accounts?它只是ArrayList accounts还是ArrayList<...> accounts?
-
您的想法是正确的,您只需要迭代列表,将传递的帐号与每个元素进行比较,并使用当前索引删除相同的值...
-
是的我知道我需要更准确地说我的坏哈哈,brso05 getAccNumber是一个来自Account类的方法,我正试图用来查找帐号和&amp;将它与参数进行比较。
-
他只是不希望我们迭代哪个很烦人!
-
您的accountList对象中应该有许多Account对象...
-
它是ArrayList 帐户
-
那么你是否将给定的帐号与帐户列表中的元素进行比较?
-
是的,正是我正在做的amaleemur,比较param与arraylist中的元素,这个元素包含变量(AccountNumber)等。
-
@ Dave95你考虑过为每个循环使用一个迭代数组的值吗?
-
我已经考虑了这个,如果匹配返回true,否则如果没有值匹配则直接退出循环并直接进入返回false语句?这听起来不错,但我不确定?这应该仍然允许boolean成为不应该的类型吗?
在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++可以跳过一个不小心。但我假设最多只有一个帐号有一个帐号。]
-
这看起来最接近他所期望的诚实,这正是它需要为我输出的!这仍然是一个布尔类型的方法吗?
-
removeIf是boolean方法。如果有的话,你对结果的处理取决于你需要什么。
-
那太棒了,非常感谢!从来没有真正讲过这个,但除了每个循环,我想不出另一个解决方案!也许他期望额外的阅读来教我们这个?哈哈
-
索引看起来很明显,我明天会尝试实现它,非常感谢你的出色答案:)
您不需要将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。
-
我不会得到错误,因为我的布尔没有返回语句? &安培;这是否意味着我必须创建一个名为getAccountByName的新方法?
-
是的我为你创造了一个!希望它应该正确适合!检查编辑!
-
听起来像我的导师在这个上有点旋钮,因为我们不允许使用迭代器,也没有创建新的方法来做到这一点!我只是无法理解我将如何在原始方法中做到这一点?
-
(Psst @StackFlowed,您可能还想检查getAccountByName;我讨厌没有匹配的帐户!)
基本上,您必须遍历列表,直到找到要删除的元素,然后将其删除。有几种方法可以实现细节,但是如果你使用的是标准java.util.ArrayList,那么我建议使用它的迭代器。没有什么能阻止你将这个操作包装在一个方法中,但是你似乎对于哪个类应该有removeAccount()方法感到困惑。
它不应该是Account类的方法,因为该类不应该知道您的列表(特别是accounts变量不应该是该类的成员)。如果您同时传递了帐号和列表,它可能是Account的静态方法,但这不是您正在做的事情。
相反,您需要将方法放在accounts变量所属的类上,或者放在该类的内部类上,否则您的方法无法访问该列表。在你的级别,你不应该试图找出内部类,这样就会留下accounts所属的类。
-
对不起,我显然没有解释自己,回头看我混淆了自己哈哈,帐号是我的arraylist的名字,我使用ArrayList 帐户定义。 removeAccount()必须是AccountList(数组列表类)的一部分。