从ArrayList中删除偶数

时间:2009-11-05 20:53:55

标签: java collections 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)发生任何偶数都无法捕获。我真的很想知道为什么。所以,任何人都可以帮助我解决这个问题,还有其他更好的方法来实现这个解决方案。

由于

9 个答案:

答案 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);