从列表中删除重复的元素

我开发了一个数组列表。

ArrayList list = new ArrayList(); list.add("1"); list.add("2"); list.add("3"); list.add("3"); list.add("5"); list.add("6"); list.add("7"); list.add("7"); list.add("1"); list.add("10"); list.add("2"); list.add("12"); 

但如上所述它包含许多重复元素。 我想删除该列表中的所有重复项。 为此我想首先我需要将列表转换为集合。

Java是否提供将列表转换为集合的function? 是否有其他设施可以从列表中删除重复项?

您可以使用以下命令转换为Set:

 Set aSet = new HashSet(list); 

或者您可以转换为一个集合并返回到列表:

 list = new ArrayList(new HashSet(list)); 

然而,这两者都不可能保持元素的顺序。 要保留顺序,可以在迭代时使用HashSet作为辅助结构:

 List list2 = new ArrayList(); HashSet lookup = new HashSet(); for (String item : list) { if (lookup.add(item)) { // Set.add returns false if item is already in the set list2.add(item); } } list = list2; 

在重复的情况下,只有第一次出现在结果中。 如果您只想显示最后一个匹配项,那就更难了。 我将通过反转输入列表,应用上述内容,然后反转结果来解决它。

这个:

 Set set = new HashSet(); set.addAll(list); list.clear(); list.addAll(set); 

Java 8方式: list.stream().distinct().collect(Collectors.toList());

完了:)

如果需要保留元素顺序,则使用LinkedHashSet而不是HashSet

 Set mySet = new LinkedHashSet(list); 

只需使用普通的构造函数:

 ArrayList yourList; HashSet set = new HashSet(yourList); 

并且您将获得项目的新视图,删除重复项,但您将失去订购。 到目前为止发布的每个答案都是如此。 为了保持排序,您应该迭代现有列表并仅在元素重复时删除元素(可以使用集合来检查元素是否已找到)。

您可以在第一时间使用一组或转换为它:

  Set set = new TreeSet(list); 
 package com.scjp.dump.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ArrayListTest { public static void main(String[] args) { List mylist2 = new ArrayList(); List mylist1 = new ArrayList(); mylist1.add(3); mylist1.add(3); mylist1.add(5); mylist1.add(9); mylist1.add(2); mylist1.add(5); mylist1.add(5); mylist1.add(3); mylist1.add(3); mylist1.add(3); mylist1.add(9); mylist1.add(56); System.out.println(mylist1); Iterator itr1 = mylist1.listIterator(); while (itr1.hasNext()) { Integer itn1 = (Integer) itr1.next(); if (mylist2.contains(itn1) == false) mylist2.add(itn1); } System.out.println(mylist2); } }