删除 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);
                }
            }
        }
    }
 }

修改列表时使用Iterator遍历列表

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

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

不要在 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]

尝试:

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