代码之家  ›  专栏  ›  技术社区  ›  Talha Bin Shakir

从ArrayList中删除偶数

  •  1
  • Talha Bin Shakir  · 技术社区  · 16 年前

    我必须创建一个具有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 回复  |  直到 16 年前
        1
  •  8
  •   Rasmus Kaj    16 年前

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

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

    我将使用迭代器遍历列表,并在该迭代器上执行删除操作,如下所示:

    for(Iterator i = number.iterator(); i.hasNext(); ) {
        if (isEven(i.next()) {
            i.remove();
        }
    }
    
        2
  •  6
  •   BalusC    16 年前

    使用 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);
    
        3
  •  4
  •   Walter Mundt    16 年前

    关于列表索引更改的两个答案都是正确的。但是,也要注意,从ArrayList中删除一个项目的速度很慢,因为它实际上必须将下面的所有条目向下洗牌。相反,我建议创建一个只包含偶数的新列表,然后扔掉旧列表。如果您想在另一个答案中使用基于迭代器的删除代码,它可以很好地处理小结果,如果您使用LinkedList,则可以处理较大的数据集。(我相信这就是名字;我的Java确实有点生锈。)

        4
  •  1
  •   Adam Wright    16 年前

        5
  •  1
  •   Stephen    16 年前

    问题是(正如其他人所提到的)在遍历列表时正在修改列表。尝试在“if(偶数==0)”块中添加一行“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);
    
            // Add this:
            i--;
        }
    }
    
        6
  •  0
  •   dustmachine    16 年前

    这里有另一种巧妙的过滤奇数元素的方法。不要手动循环收集,而是将工作卸载到 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
         }
     });
    

    这是否真的更容易阅读和理解还有争议,但它更有趣。如果某类谓词被频繁使用,它可以被重构成一个静态常量,并在所有地方重用。这将使it的使用变得更加干净:

    CollectionUtils.filter(numberList, ODD_PREDICATE);
    
        7
  •  0
  •   volvox    13 年前

    我所做的(Intelliji与kotlin)

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

        8
  •  0
  •   Ralf Stubner    8 年前
    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);
        }
    }
    
        9
  •  0
  •   Arpit Agrawal    7 年前

    我们可以在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);