2012-04-29 218 views
3

我开发了一个数组列表。删除列表中的重复元素

ArrayList<String> list = new ArrayList<String>(); 

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是否提供将列表转换为集合的功能?是否有其他设施可以从列表中删除重复项?

+2

你为什么不创建一个Set来开始? – Patrick 2012-04-29 08:31:15

+1

Set Set = new HashSet (list); – 2012-04-29 08:33:53

+0

可能的重复[如何从ArrayList中删除重复元素?](http://stackoverflow.com/questions/203984/how-do-i-remove-repeated-elements-from-arraylist) – Raedwald 2015-03-05 21:49:04

回答

9

此:

Set<String> set = new HashSet<String>(); 
set.addAll(list); 
list.clear(); 
list.addAll(set); 
+0

@Abshiek,谢谢,所以最终Java提供了将列表转换为集合的功能。 – dghtr 2012-04-29 08:33:16

+4

@ user1351820其实Java提供了一个构造函数来初始化一个'Collection'与任何其他的'Collection',所以它甚至更广泛:) – Jack 2012-04-29 08:34:34

0

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

Set<String> set = new TreeSet<String>(list); 
23

可以转换成套装搭配:

Set<String> aSet = new HashSet<String>(list); 

或者你可以转换成一个集合并回到列表中:

list = new ArrayList<String>(new HashSet<String>(list)); 

但是,这两者都不可能保留元素的顺序。为了维持秩序,您可以使用HashSet作为辅助结构,而迭代:

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

在重复的情况下,只有第一次出现将出现在结果中。如果你只想要最后一次出现,那是一个更加棘手的问题。我将通过反转输入列表来解决这个问题,应用上面的内容,然后反转结果。

+0

嗨特德,非常感谢你能解释一下list = new ArrayList (new HashSet (list)) ;首先我们将列表转换为一个集合,然后尝试将集合转换回列表。 – dghtr 2012-04-29 08:37:38

+1

@ user1351820 - 转换为“Set”消除重复。转换回“List”会为您提供一个固定(但未确定)顺序的集合,您可以通过索引访问元素。如果你所需要的只是一个集合(没有任何特定的顺序 - 包括对不变的集合的不同迭代可能会有不同的顺序),那么就去第一个选项。如果您需要保留原始订单,请与第三个订单一起进行。 – 2012-04-29 08:44:41

1

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

ArrayList<T> yourList; 
HashSet<T> set = new HashSet<T>(yourList); 

而且你将有项目的一个新的观点,以重复删除,但你会失去订单。在迄今发布的每个答案中都是如此。为了保持顺序,你应该迭代现有的列表并删除一个元素,只要它是重复的(可以使用set来检查元素是否已经找到)。

0
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<Integer> mylist2 = new ArrayList<Integer>(); 

     List<Integer> mylist1 = new ArrayList<Integer>(); 
     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<Integer> itr1 = mylist1.listIterator(); 
     while (itr1.hasNext()) { 
      Integer itn1 = (Integer) itr1.next(); 
      if (mylist2.contains(itn1) == false) 
       mylist2.add(itn1); 
     } 

     System.out.println(mylist2); 

    } 

} 
3

如果您需要保留的元素,然后使用顺序,而不是HashSet的

Set<String> mySet = new LinkedHashSet<String>(list); 
3

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

做:)

+0

尽管您删除了重复项,但您仍然会返回一个“List”。这回答了基本问题,但原始的海报评论他期望得到关于“将列表转换为集合”的答案。 – YoYo 2016-09-07 22:40:42

+1

如果需要设置,您可以在末尾执行'Collectors.toSet()'而不是'.toList()'。 – 2016-09-15 20:50:20