Java 删除LinkedList中的重复项
我是java的初学者。我编写了以下代码来查找重复项并在LinkedList中删除它们,但是我得到了ArrayIndexOutOfBounds异常。请帮忙。提前谢谢Java 删除LinkedList中的重复项,java,collections,linked-list,Java,Collections,Linked List,我是java的初学者。我编写了以下代码来查找重复项并在LinkedList中删除它们,但是我得到了ArrayIndexOutOfBounds异常。请帮忙。提前谢谢 import java.util.*; public class LinkedListEx { public static void main(String[] args) { LinkedList<Integer> l1 = new LinkedList<Integ
import java.util.*;
public class LinkedListEx
{
public static void main(String[] args)
{
LinkedList<Integer> l1 = new LinkedList<Integer>();
l1.add(1);
l1.add(2);
l1.add(1);
l1.add(4);
l1.add(1);
System.out.println(l1);
int i = l1.size();
for(int j=0;j<i;j++)
{
for(int k=j+1;k<i;k++)
{
if(l1.get(j) == l1.get(k)){
l1.remove(k);
}
}
}
}
}
import java.util.*;
公共类LinkedListEx
{
公共静态void main(字符串[]args)
{
LinkedList l1=新LinkedList();
l1.加入(1);
l1.加入(2);
l1.加入(1);
l1.加入(4);
l1.加入(1);
系统输出打印LN(l1);
int i=l1.size();
对于(int j=0;j当您要修改列表时,使用迭代器遍历列表
您正在从列表中删除项目,这会减少列表的大小,但循环仍会针对列表的初始大小运行。在您要修改列表时,请使用迭代器遍历列表
您正在从列表中删除项目,这会减小列表的大小,但循环仍会按列表的初始大小运行。您的for loop
应该更像这样,并通过更新变量i
:
int i = l1.size();
for(int j=0;j<i-1;j++) {
for(int k=j+1;k<i;k++) {
if(l1.get(j) == l1.get(k)) {
l1.remove(k);
i--; //Updated size
}
}
}
inti=l1.size();
for(int j=0;j您的for循环
应该更像这样,并且通过更新变量i
:
int i = l1.size();
for(int j=0;j<i-1;j++) {
for(int k=j+1;k<i;k++) {
if(l1.get(j) == l1.get(k)) {
l1.remove(k);
i--; //Updated size
}
}
}
inti=l1.size();
对于(int j=0;j不要在LinkedList
上使用get(int)
。在ArrayList
上可以,但是LinkedList
必须遍历列表才能找到第n个元素
使用集合
记住已经看到的值,并使用迭代器
迭代列表
LinkedList<Integer> l1 = new LinkedList<Integer>();
l1.add(1);
l1.add(2);
l1.add(1);
l1.add(4);
l1.add(1);
System.out.println(l1);
HashSet<Integer> set = new HashSet<Integer>();
for (Iterator<Integer> iter = l1.iterator(); iter.hasNext(); ) {
Integer value = iter.next();
if (! set.add(value))
iter.remove();
}
System.out.println(l1);
不要在LinkedList
上使用get(int)
。在ArrayList
上可以,但是LinkedList
必须遍历列表才能找到第n个元素
使用集合
记住已经看到的值,并使用迭代器
迭代列表
LinkedList<Integer> l1 = new LinkedList<Integer>();
l1.add(1);
l1.add(2);
l1.add(1);
l1.add(4);
l1.add(1);
System.out.println(l1);
HashSet<Integer> set = new HashSet<Integer>();
for (Iterator<Integer> iter = l1.iterator(); iter.hasNext(); ) {
Integer value = iter.next();
if (! set.add(value))
iter.remove();
}
System.out.println(l1);
尝试:
或者,如果它不一定是LinkedList(在我的经验中不经常需要):
尝试:
或者,如果它不一定是LinkedList(在我的经验中不经常需要):
问题是在第二个循环中检查int k=j+1是否对上的列表有效,然后进入该循环。您可以使用备用数据结构吗?@StackFlowed-no-itsj问题是在第二个循环中检查int k=j+1是否对上的列表有效,然后进入该循环。您可以使用备用数据结构吗?@StackFlowed-no-its非常感谢..我没有意识到这一点。那么,使用for循环没有其他方法可以做到吗?你可以做到。你正在这样做。但这不是正确的方法。使用迭代器也可以使用for循环。类似于-for(迭代器迭代器=yourList.Iterator();迭代器.hasNext();){Integer item=Iterator.next();…}
非常感谢..我没有意识到这一点。那么,没有其他方法可以使用for循环吗?你可以这样做。你正在这样做。但这不是正确的方法。使用迭代器也可以使用for循环。类似于-for(迭代器迭代器=yourList.Iterator();迭代器.hasNext();){Integer item=Iterator.next();…}
抱歉,这不起作用,我得到了相同的例外,抱歉,这不起作用,我得到了相同的例外,这段代码太神奇了……我花了一些时间才明白,电视机不需要重复……这个网站教会了我很多:-)如果我将LinkedList转换为一个集合会发生什么?重复项会自动删除吗?@pavan Yes。这就是Puce的答案所依赖的。他只需将列表中的所有元素添加到保留顺序的集合(LinkedHashSet
),然后复制(现在是不同的)值返回到列表。请注意,HashSet
也可以工作,但它不会保留原始顺序,TreeSet
实际上会对值进行排序。这段代码太神奇了……我花了一段时间才明白该集合不需要重复项……这个网站教会了我很多:-)如果我将LinkedList转换为一个集合会发生什么?重复项会自动删除吗?@pavan Yes。这就是Puce的答案所依赖的。他只需将列表中的所有元素添加到保留顺序的集合(LinkedHashSet
),然后复制(现在是不同的)值返回到列表。请注意,HashSet
也可以,但它不会保留原始顺序,TreeSet
实际上会对值进行排序。简洁明了,但它不会从原始列表中删除重复项,而是替换列表。根据实际需要,您的答案可能是完美的,也可能是无用的。;-)@Andreas您可以使用clear()和addAll()如果您更喜欢原始列表对象…@Andreas谢谢,修复了它。@Puce这是一种简洁且最简单的方法,可以在不使用任何逻辑的情况下删除重复项。谢谢:-)非常简洁,但它不会从原始列表中删除重复项,而是替换列表。根据实际需要,您的答案可能是完美的,也可能是无用的。-@Andreas yo如果您喜欢原始列表对象,您可以使用clear()和addAll()。@Andreas谢谢,修复了它。@Puce这是一种简洁且最简单的方法,可以在不使用任何逻辑的情况下删除重复项。谢谢:-)
list = list.stream().distinct().collect(Collectors.toList());