我需要根据其自己的类实例中的变量删除元素。
我有一个名为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'方法结果'对话框返回适当的布尔值。"
答案 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
所属的类。