Java 删除LinkedList中的重复项

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

我是java的初学者。我编写了以下代码来查找重复项并在LinkedList中删除它们,但是我得到了ArrayIndexOutOfBounds异常。请帮忙。提前谢谢

    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-its
j问题是在第二个循环中检查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());