繁体   English   中英

删除LinkedList中的重复项

[英]remove duplicates in LinkedList

我是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);
                }
            }
        }
    }
 }

不要在LinkedList上使用get(int) ArrayList上很好,但是LinkedList必须遍历列表以找到第n个元素。

使用Set记住已经看到的值,然后使用Iterator迭代列表。

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);

输出量

[1, 2, 1, 4, 1]
[1, 2, 4]

当您要修改列表时,请使用Iterator遍历列表。

您正在从列表中删除项目,这减小了列表的大小,但是循环仍以列表的初始大小运行。

尝试:

List<Integer> list = new LinkedList<>();
...

Set<Integer> set = new LinkedHashSet<>(list);
// either
list = new LinkedList<>(set);

// or
list.clear();
list.addAll(set);

使用Java SE 8,您还可以使用:

list = list.stream().distinct().collect(Collectors.toCollection(LinkedList::new));

或者,如果不必一定是LinkedList(根据我的经验,它并不是经常需要的):

list = list.stream().distinct().collect(Collectors.toList());

您的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
           }
       }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM