从ArrayList中删除偶数

我必须创建一个具有ArrayList的方法; 我需要从这个ArrayList中删除偶数。 我已经写了代码,但有一个逻辑错误,我无法识别。

这是我的代码:

static void sortList(){ List <Integer> number=new ArrayList <Integer>(); number.add(11); number.add(45); number.add(12); number.add(32); number.add(36); System.out.println("Unsorted List: "+number); for (int i=0;i<number.size();i++){ int even=number.get(i)%2; if (even==0){ System.out.println("This is Even Number:"+ number.get(i)); number.remove(i); } } Collections.sort(number); System.out.println("Sorted List: "+number); } 

代码的输出是:

 Unsorted List: [11, 45, 12, 32, 36] This is Even Number:12 This is Even Number:36 Sorted List: [11, 32, 45] 

我想知道为什么32不是偶数,因为它是偶数,我在同一位置用不同的偶数测试,结果是一样的。 为什么在指数(3)它发生的任何偶数不可能赶上。 我真的想知道为什么。 所以请任何人都可以帮我解决这个问题,还有其他更好的方法来实现这个解决方案。

谢谢

使用Iterator 。 它有一个你需要的remove()方法。

 List<Integer> numbers = new ArrayList<Integer>(); numbers.add(11); numbers.add(45); numbers.add(12); numbers.add(32); numbers.add(36); System.out.println("Unsorted List: " + numbers); for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) { Integer number = iterator.next(); if (number % 2 == 0) { System.out.println("This is Even Number: " + number); iterator.remove(); } } Collections.sort(numbers); System.out.println("Sorted List: " + numbers); 

当你从列表中删除的东西,后面的一切索引改变!

具体来说,在你的实现中,32不会被删除,因为它直接在另一个偶数之后。

我将使用迭代器来遍历列表,然后对该迭代器进行删除操作,如下所示:

 for(Iterator i = number.iterator(); i.hasNext(); ) { if (isEven(i.next()) { i.remove(); } } 

关于列表索引变化的两个答案是正确的。 但是,也要注意,从ArrayList中删除一个项目是很慢的,因为它必须将所有的下面的项目实际混洗。 相反,我建议创建一个只包含偶数的新列表,然后扔掉旧列表。 如果您想在其他答案中使用基于迭代器的移除代码,那么对于小型结果,如果您使用LinkedList,则对于较大的数据集可以正常工作。 (我相信这是名字,我的Java无疑是有点生疏的。)

如果从列表中删除一个条目并循环播放,则必须调整循环索引。 不要忘了,删除元素会将列表的长度减1,并有效地“后退”所有元素的索引。

这个问题(正如其他人所说的那样)是在你遍历的时候修改列表。 尝试添加“我 – ”; 在你的“if(even == 0)”块内。 喜欢这个:

 for (int i=0;i<number.size();i++){ int even=number.get(i)%2; if (even==0){ System.out.println("This is Even Number:"+ number.get(i)); number.remove(i); // Add this: i--; } } 

这是奇数元素的另一个漂亮的过滤方法。 不要手动循环收集,而是将工作卸载到Apache Commons Collections

  // apply a filter to the collection CollectionUtils.filter(numbers, new Predicate() { public boolean evaluate(Object o) { if ((((Integer) o) % 2) == 0) { return false; // even items don't match the filter } return true; // odd items match the filter } }); 

这是否真的比较容易阅读和理解,这是值得商榷的,但它更有趣。 如果经常使用某种谓词,则可将其重构为一个静态常量,并在所有地方重用。 这可以把它的使用变得更清洁:

 CollectionUtils.filter(numberList, ODD_PREDICATE); 

我做什么(与kotlin Intelliji)

 fun main(args: Array<String>) { var numbers = arrayList(1,2,3,4,5,6) println(numbers.filter{it %2 == 0}) } 

结果= 2,4,6