java - 链表 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 的倍数?
解决方案
您在迭代列表元素时正在删除它。因此,例如,在删除索引为 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);
享受 ;)
推荐阅读
- javascript - 抄送部分一次发送一封电子邮件,然后多发到第一封
- java - 从 LocalDateTime 类获取时间值不会编译
- ruby-on-rails - Rails : Controller/Create - 如何编写 if create 成功
- c++ - 即使列表已填满,std::list::empty() 也会返回 true
- javascript - Google Script GetRange 与基于列中的值的过滤器并仅选择某些列
- arrays - 空手道 - 如何检查数组是否包含值?
- node.js - ActivatedRoute.params.subscribe 调用了两次
- python - 如何在熊猫分配中动态地给出列名
- python - 从 numpy 数组中的大字符串中获取子字符串
- office365 - 如何在使用 word 插件时使用 office js API 或任何其他方式保存带有文件名的 word 文档?