从ArrayList中删除偶数

问题描述 投票:0回答:11

我必须创建一个具有 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)处会发生任何偶数都无法捕获的情况。我真的很想知道为什么。所以请任何人都可以帮助我解决这个问题,还有其他更好的方法来实现这个解决方案吗?

谢谢

java collections arraylist
11个回答
8
投票

当您从列表中删除某些内容时,之后所有内容的索引都会发生变化!

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

我会使用迭代器遍历列表,并使用该迭代器上的删除操作,如下所示:

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

6
投票

使用

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

4
投票

关于列表索引更改的两个答案都是正确的。 但是,还要注意,从 ArrayList 中删除项目的速度很慢,因为它必须实际上将以下所有条目向下排列。 相反,我建议创建一个仅包含偶数的新列表,然后丢弃旧列表。 如果您想在另一个答案中使用基于迭代器的删除代码,那么它对于小结果来说可以很好地工作,如果您使用 LinkedList,则对于较大的数据集来说,它可以很好地工作。 (我相信这就是名字;无可否认,我的 Java 有点生疏了。)


1
投票

如果您在循环遍历列表时从列表中删除一个条目,则必须调整循环索引。不要忘记,删除元素会使列表的长度减少一,并有效地“洗牌”其后所有元素的索引。


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--;
    }
}

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
     }
 });

这是否真的更容易阅读和理解还有待商榷,但它更有趣。 如果某种 Predicate 经常使用,可以将其重构为静态常量并在各处重用。 这可以将它的使用变得更加干净:

CollectionUtils.filter(numberList, ODD_PREDICATE);

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


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);
    }
}

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

0
投票

也可以在循环结束前添加 i-- 。当我们从列表中删除一个项目时,下一个元素将占据已删除项目的位置。因此循环不会循环该元素。通过减小 i 的值,循环返回并检查之前跳过的项目。

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);
        i--;
    }    
}

0
投票

d=[]

对于(g=1;g

{

d.push(ParseInt(prompt("告诉我要添加什么")))

}

对于(g=1;g

{

如果(d[g]%2==0)

{

d.拼接(g,g)

}

console.log("排除偶数的列表为",d)

}

© www.soinside.com 2019 - 2024. All rights reserved.