java删除ArrayList中重复的元素

作者:简简单单 2016-02-25

ArrayList是java集合框架中List接口的最常见的实现。不过,ArrayList里是允许存放相同的元素的。虽然java中有另外一个叫Set的集合专门用来存放不重复的元素。不过可能会遇到这样的需要:我们需要在处理数据之前删除ArrayList中重复的元素。ArrayList自然是没法保证其所有的元素都唯一。
我们有多种方法实现:
1.通过在循环数组的时候,将元素插入到Set中,利用Set的属性来实现删除重复元素。

2.还是循环ArrayList,通过remove()方法,来删除重复元素

不过最简单的方法是将ArrayList拷贝到Set中,例如HashSet,然后再将其拷贝回ArrayList。这样就省去了自己写代码的麻烦。
注意:
1.不过有一点要注意的是,如果你的ArrayList中原本是有顺序的,如果想利用Set去掉重复元素后,其顺序已经保持不变,那么我们必须使用LinkedHashSet,因为HashSet是无序的。

2.如果你自己写代码使用Iterator或者for-each循环删除重复元素,确保你使用的是Iterator的remove()方法,而不是ArrayList自带的remove()方法,这样可以避免ConcurrentModificationException。

java代码实现:
1.将ArrayList中的所有元素拷贝到LinkedHashSet中。为何我们选择LinkedHashSet?因为它能在删除重复的元素的同时,维护原有的插入顺序。

2.清空原来的ArrayList,我们可以使用ArrayList中的clear()方法。

3.将LinkedHashSet(已经没有重复的元素)中所有的元素拷贝到ArrayList。

How to remove duplicates from ArrayList in Java
完整代码如下:


import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
 * Java Program to remove repeated elements from ArrayList in Java.
 *
 * @author WINDOWS 8
 */
public class ArrayListDuplicateDemo{
 
  
    public static void main(String args[]){
  
        // creating ArrayList with duplicate elements
        List primes = new ArrayList();
      
        primes.add(2);
        primes.add(3);
        primes.add(5);
        primes.add(7);  //duplicate
        primes.add(7);
        primes.add(11);
      
        // let's print arraylist with duplicate
        System.out.println("list of prime numbers : " + primes);
      
        // Now let's remove duplicate element without affecting order
        // LinkedHashSet will guaranteed the order and since it's set
        // it will not allow us to insert duplicates.
        // repeated elements will automatically filtered.
      
        Set primesWithoutDuplicates = new LinkedHashSet(primes);
      
        // now let's clear the ArrayList so that we can copy all elements from LinkedHashSet
        primes.clear();
      
        // copying elements but without any duplicates
        primes.addAll(primesWithoutDuplicates);
      
        System.out.println("list of primes without duplicates : " + primes);
      
    }
 
}
Output
list of prime numbers : [2, 3, 5, 7, 7, 11]
list of primes without duplicates : [2, 3, 5, 7, 11]

总结:好吧,原文只是说了使用Set来删除ArrayList中重复元素好,但是却没说为什么。我这里就来分析下两种方法的优异:
利用Set来删除ArrayList中的重复元素不仅简单,而且比使用循环来一一查找删除重复元素要快。因为所谓删除重复元素,其实就是查找元素。如果使用for循环来一一查找,然后删除,那么时间复杂度O(n2),而如果换做是LinkedHashSet,其实和HashSet没太大区别,那么使用了hashtable的方式,则查找元素的时间复杂是O(1),比第一种方法快到哪里去啦。

相关文章

精彩推荐