Java的List去重

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的List去重相关的知识,希望对你有一定的参考价值。

Java的List去重

1.contains()去重

ArrayList 的 contains() 方法的时间复杂度是 O ( n ) O(n) O(n)的。

使用contains 进行判断去重的 时间复杂度是 O ( n 2 ) O(n^2) O(n2)

保证去重后相对顺序不变。

public class ListDistinctExample 
    public static void main(String[] args) 
        List<Integer> list = new ArrayList<Integer>() 
            add(1);
            add(3);
            add(5);
            add(2);
            add(1);
            add(3);
            add(7);
            add(2);
        ;
        System.out.println("原集合:" + list);
        method(list);
    

    /**
     * 自定义去重
     * @param list
     */
    public static void method(List<Integer> list) 
        // 新集合
        List<Integer> newList = new ArrayList<>(list.size());
        list.forEach(i -> 
            if (!newList.contains(i))  // 如果新集合中不存在则插入
                newList.add(i);
            
        );
        System.out.println("去重集合:" + newList);
    


2.迭代器去重

自定义 List 去重,除了上面的新建集合之外,我们也可以使用迭代器循环判断每一项数据,如果当前循环的数据,在集合中存在两份或两份以上,就将当前的元素删除掉,这样循环完之后,也可以得到一个没有重复数据的集合,实现代码如下:

public class ListDistinctExample 
    public static void main(String[] args) 
        List<Integer> list = new ArrayList<Integer>() 
            add(1);
            add(3);
            add(5);
            add(2);
            add(1);
            add(3);
            add(7);
            add(2);
        ;
        System.out.println("原集合:" + list);
        method_1(list);
    

    /**
     * 使用迭代器去重
     * @param list
     */
    public static void method_1(List<Integer> list) 
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) 
            // 获取循环的值
            Integer item = iterator.next();
            // 如果存在两个相同的值
            if (list.indexOf(item) != list.lastIndexOf(item)) 
                // 移除最后那个相同的值
                iterator.remove();
            
        
        System.out.println("去重集合:" + list);
    

使用迭代器去重,不需要开辟新的空间,不保证相对顺序不变。

方法3:HashSet去重(无序)

HashSet 会自动排序。

    public static void method_2(List<Integer> list) 
        HashSet<Integer> set = new HashSet<>(list);
        System.out.println("去重集合:" + set);
    

方法4:LinkedHashSet去重(有序)

既然 HashSet 会自动排序不能满足需求,那就使用 LinkedHashSet,它既能去重又能保证集合的顺序,实现代码如下:

     */
    public static void method_3(List<Integer> list) 
        LinkedHashSet<Integer> set = new LinkedHashSet<>(list);
        System.out.println("去重集合:" + set);
    

方法5:TreeSet去重(无序)

TreeSet也会自动去重

除了以上的 Set 集合之外,我们还可以使用 TreeSet 集合来实现去重功能,实现代码如下:

    public static void method_4(List<Integer> list) 
        TreeSet<Integer> set = new TreeSet<>(list);
        System.out.println("去重集合:" + set);
    

方法6:Stream去重(有序)

Stream 实现去重功能和其他方法不同的是,它不用新创建集合,使用自身接收一个去重的结果就可以了,并且实现代码也很简洁,并且去重后的集合顺序也和原集合的顺序保持一致,是我们最优先考虑的去重方法。

    public static void method_5(List<Integer> list) 
        list = list.stream().distinct().collect(Collectors.toList());
        System.out.println("去重集合:" + list);
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPScvHNZ-1640780666386)(C:\\Users\\HeHao\\AppData\\Roaming\\Typora\\typora-user-images\\image-20211229195711770.png)]

以上是关于Java的List去重的主要内容,如果未能解决你的问题,请参考以下文章

list去重+Java8-Stream distinct 根据list某个字段去重

Java的List去重

Java的List去重

java8 List去重

java List 去重(两种方式)

Java中对List去重, Stream去重