首页 > 解决方案 > 链表 remove() 和索引不准确

问题描述

我试图从链接列表中删除所选数字的所有倍数,例如,删除 2 的倍数:

[0, 12, 16, 0, 13, 9, 13, 17, 5, 12, 1, 12, 5, 5, 1, 6, 14, 12, 14, 14] -> [13, 9, 13, 17、5、1、5、5、1]

我编写了这段代码来构造一个包含 20 个随机整数的链表,然后根据条件从中删除元素。

import java.util.Scanner;
import java.util.*;

public class MyList {
    public static void main(String args[])
    {
        int entero = 0;
        Random random = new Random();
        LinkedList<Integer> objectList = new LinkedList<Integer>();
        Scanner scan = new Scanner(System.in);
        for(int i=0; i<20; i++){
            int randomInteger = random.nextInt(20);
            objectList.add(randomInteger);
        }
        System.out.print("Enter a number between 1 y 5: ");
        int intNumber = scan.nextInt();
        if(intNumber > 5 || intNumber < 1){
        }else{
            System.out.println("List : " + objectList);
            if(intNumber == 2){
                for(int j=0; objectList.size()>j; j++){
                    System.out.println("va " + objectList.get(j));
                    if (objectList.get(j) % 2 == 0) {
                        objectList.remove(objectList.get(j));;
                    }
                }
            }
        }
        System.out.println("Final List : " + objectList);
    }
}

这样做的问题是它不会删除某些项目,即使它应该(例如:条件 14%2==0 被评估为真,但数字不会被删除),所以结果最终是这样的:

从 [0, 12, 16, 0, 13, 9, 13, 17, 5, 12, 1, 12, 5, 5, 1, 6, 14, 12, 14, 14] -> 到 [0, 13, 9、13、17、5、1、5、5、1、12、14、14]

为什么这不会从列表中删除所有 2 的倍数?

标签: javaif-statementindexinglinked-list

解决方案


您在迭代列表元素时正在删除它。因此,例如,在删除索引为 0 的元素之后,下一次迭代将指向 objectList[1],它在删除 objectList[0] 之前是 objectList[2]。调试时可以很容易地看到它。

因此,您可以例如创建要删除的元素列表,然后使用 removeAll(toDelete)。

但就我而言,最好的方法是使用流 api。

objectList.stream().filter(o -> o%2!=0).collect(Collectors.toList())

将返回您所需要的。

更新:我刚刚发现,有一种removeIf(Predicate<? super E> filter)方法。

所以你可以简单地使用

l.removeIf(o -> o % 2 == 0);

享受 ;)


推荐阅读