public static void main(String [] args){
Scanner input = new Scanner(System.in);
System.out.println("Enter some numbers (all on one line, separated by spaces):");
String line = input.nextLine();
String[] numbers = line.split(" +");
ArrayList<Integer> a = new ArrayList<Integer>();
for(int i=0; i<numbers.length; i++)
a.add(new Integer(numbers[i]));
System.out.println("The numbers are stored in an ArrayList");
System.out.println("The ArrayList is "+a);
System.out.print("\nEnter a number: ");
int p = input.nextInt();
System.out.println(removeNumber(a,p));
System.out.println(removeNumber2(a,p));
}
public static <T> ArrayList<T> removeNumber(ArrayList<T> a, Integer e)
{
ArrayList<T> b = new ArrayList<T>();
for(int i = 0; i< a.size();i++)
{
if (a.get(i).equals(e))
a.remove(e);
}
return a;
}
如果ex.value = 4,我想从arrayList中删除4。如果我的arraylist包含[5,12,4,16,4],我想删除它的第一个出现的四个,并将其保存到另一个arraylist。 不想使用迭代器
答案 0 :(得分:0)
您不能迭代ArrayList
并同时修改它,而不是Iterator
这样做:
for(Iterator<T> i = a.iterator(); i.hasNext();)
{
if (i.next().equals(e.value))
{
i.remove();
}
}
BTW,你的b ArrayList是无用的。
答案 1 :(得分:0)
除了使用迭代器的建议外,您不应该使用运算符==来检查引用相等性。在您的方案中,这始终是错误的。您希望使用equals方法来检查值的相等性。
if (a.get(i).equals((Integer)e.value)))
答案 2 :(得分:0)
您无需使用迭代器或索引遍历列表。 ArrayList
有remove
方法搜索并删除元素,和返回true
或false
,具体取决于是否找到要删除的元素。所以你可以说
while (true) {
boolean found = a.remove(e.value);
if (!found) {
break;
}
}
或
boolean found;
do {
found = a.remove(e.value);
} while(found);
或者如果你认为紧凑性超过可读性,
do { } while(a.remove(e.value));
请注意,原始代码中的a.remove(e)
根本不起作用。 ArrayList
是ArrayList
Integer
,但e
是EX6
。因此,a.remove(e)
根本不会在列表中找到e
,因为它甚至不是正确的类型。它应该编译正常,因为remove
被定义为允许任何Object
作为参数,但它永远不会找到任何东西(因为equals
Integer
方法始终返回{{ 1}}表示非false
)。
答案 3 :(得分:0)
不使用迭代器,您可以采取以下措施来修复代码:
for(int i = 0; i< a.size();i++) {
if (a.get(i).equals(e.value)) {
a.remove(e.value);
i--;
}
}
除了==
更改为equals
之外,每当您从i
删除元素时,都必须递减ArrayList
。这样做的原因是从i
中删除ArrayList
元素会将跟随它的所有元素的索引减少一个。因此,i+1
元素将成为新的i
元素,因此您必须递减i
以便不跳过下一个元素。
编辑:出于某种原因,我确信您要从列表中删除所有出现的号码,而不仅仅是第一个号码。如果您只想从列表中删除一个元素,则不必担心在删除该元素后迭代列表的其余部分。