删除 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());
我是 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());