我必须创建一个具有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)发生任何偶数都无法捕获。我真的很想知道为什么。所以,任何人都可以帮助我解决这个问题,还有其他更好的方法来实现这个解决方案。
由于
答案 0 :(得分:8)
当您从列表中删除某些内容时,所有内容的索引都会发生变化!
具体来说,在您的实现中,32不会被删除,因为它直接来自另一个偶数。
我会使用Iterator遍历列表,并在该迭代器上执行remove操作,如下所示:
for(Iterator i = number.iterator(); i.hasNext(); ) {
if (isEven(i.next()) {
i.remove();
}
}
答案 1 :(得分:5)
使用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);
答案 2 :(得分:4)
关于列表索引更改的两个答案都是正确的。但是,还要注意从ArrayList中删除项目的速度很慢,因为它必须实际上将所有以下条目向下移动。相反,我建议创建一个仅包含偶数的新列表,然后丢弃旧列表。如果你想在另一个答案中使用基于Iterator的删除代码,它将适用于小结果,如果使用LinkedList则适用于较大的数据集。 (我相信这就是名字;我的Java确实有点生锈。)
答案 3 :(得分:1)
如果在循环播放条目时从列表中删除条目,则必须调整循环索引。不要忘记,删除元素会将列表的长度减少一个,并有效地“后退”后面所有元素的索引。
答案 4 :(得分:1)
问题(正如其他人所提到的)是您在遍历时修改列表。尝试添加“i--;”在“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--;
}
}
答案 5 :(得分:0)
这是另一种过滤奇数元素的好方法。而不是手动循环集合,将工作卸载到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);
答案 6 :(得分:0)
我做什么(Intelliji与kotlin)
fun main(args: Array<String>) {
var numbers = arrayList(1,2,3,4,5,6)
println(numbers.filter{it %2 == 0})
}
结果= 2,4,6
答案 7 :(得分:0)
public class RemoveEvenUsingAL {
public static void main(String[] args) {
List<Integer> list= new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
Integer number= it.next();
if(number % 2 ==0){
it.remove();
}
}
System.out.println("ArryList Odd Number="+list);
}
}
答案 8 :(得分:0)
我们可以在ArrayList类中使用removeIf默认方法。
List <Integer> number=new ArrayList <Integer>();
number.add(11);
number.add(45);
number.add(12);
number.add(32);
number.add(36);
number.removeIf(num -> num%2==0);
System.out.println(number);