[英]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.