返回

消除重复:让数据焕发活力!五种技巧告别ArrayList里的繁冗//

闲谈

清理杂草:ArrayList去重术

在编程的世界里,ArrayList就像一个容器,可以容纳各种数据元素。然而,有时我们可能不小心将重复的数据元素添加进去,就像花园里的杂草一样,不仅浪费空间,还会影响程序的运行效率。因此,掌握一些去重技巧,就好似除草一般,能让我们轻松剔除重复数据,让程序更加清爽高效。

一、去重的利器:LinkedHashSet

LinkedHashSet,顾名思义,是一个有序且唯一的元素集合,与HashSet不同的是,它保留了元素的插入顺序。当我们把ArrayList中的数据元素添加到LinkedHashSet中时,重复的数据元素会被自动过滤掉,而唯一的数据元素则会按照插入顺序排列。最后,我们只需要将LinkedHashSet中的元素重新添加到ArrayList中,即可实现去重。

import java.util.ArrayList;
import java.util.LinkedHashSet;

public class RemoveDuplicatesWithLinkedHashSet {

    public static void main(String[] args) {
        // 创建一个ArrayList,其中包含重复数据
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(2);
        arrayList.add(5);

        // 使用LinkedHashSet去除重复数据
        LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>(arrayList);

        // 将LinkedHashSet中的元素重新添加到ArrayList中
        ArrayList<Integer> uniqueArrayList = new ArrayList<>(linkedHashSet);

        // 打印去重后的ArrayList
        System.out.println(uniqueArrayList);
    }
}

二、简单高效:HashSet

HashSet也是一个无序且唯一的元素集合,与LinkedHashSet相比,它不保留元素的插入顺序。虽然如此,HashSet在去重方面依然表现出色。我们可以直接将ArrayList中的数据元素添加到HashSet中,重复的数据元素会被自动过滤掉,而唯一的数据元素则会随机存储在HashSet中。最后,我们只需要将HashSet中的元素重新添加到ArrayList中,即可实现去重。

import java.util.ArrayList;
import java.util.HashSet;

public class RemoveDuplicatesWithHashSet {

    public static void main(String[] args) {
        // 创建一个ArrayList,其中包含重复数据
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(2);
        arrayList.add(5);

        // 使用HashSet去除重复数据
        HashSet<Integer> hashSet = new HashSet<>(arrayList);

        // 将HashSet中的元素重新添加到ArrayList中
        ArrayList<Integer> uniqueArrayList = new ArrayList<>(hashSet);

        // 打印去重后的ArrayList
        System.out.println(uniqueArrayList);
    }
}

三、有序去重:TreeSet

TreeSet是一个有序且唯一的元素集合,与HashSet不同的是,它按照元素的自然顺序或比较器指定的顺序排列元素。当我们把ArrayList中的数据元素添加到TreeSet中时,重复的数据元素会被自动过滤掉,而唯一的数据元素则会按照顺序存储在TreeSet中。最后,我们只需要将TreeSet中的元素重新添加到ArrayList中,即可实现去重。

import java.util.ArrayList;
import java.util.TreeSet;

public class RemoveDuplicatesWithTreeSet {

    public static void main(String[] args) {
        // 创建一个ArrayList,其中包含重复数据
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(2);
        arrayList.add(5);

        // 使用TreeSet去除重复数据
        TreeSet<Integer> treeSet = new TreeSet<>(arrayList);

        // 将TreeSet中的元素重新添加到ArrayList中
        ArrayList<Integer> uniqueArrayList = new ArrayList<>(treeSet);

        // 打印去重后的ArrayList
        System.out.println(uniqueArrayList);
    }
}

四、简洁高效:Stream API

Java 8引入了Stream API,为我们提供了更简洁高效的数据处理方式。我们可以使用Stream API轻松实现ArrayList去重。首先,我们将ArrayList转换为Stream,然后使用distinct()方法过滤重复的数据元素,最后将过滤后的Stream转换为新的ArrayList。

import java.util.ArrayList;
import java.util.stream.Collectors;

public class RemoveDuplicatesWithStreamAPI {

    public static void main(String[] args) {
        // 创建一个ArrayList,其中包含重复数据
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(2);
        arrayList.add(5);

        // 使用Stream API去除重复数据
        ArrayList<Integer> uniqueArrayList = arrayList.stream()
                .distinct()
                .collect(Collectors.toCollection(ArrayList::new));

        // 打印去重后的ArrayList
        System.out.println(uniqueArrayList);
    }
}

五、逐个元素遍历:Iterator

Iterator是一种逐个元素遍历集合的工具,我们可以使用Iterator来遍历ArrayList,并使用Set来存储唯一的数据元素。当我们在ArrayList中遇到重复的数据元素时,我们就将其从Set中删除。最后,我们将Set中的元素重新添加到ArrayList中,即可实现去重。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

public class RemoveDuplicatesWithIterator {

    public static void main(String[] args) {
        // 创建一个ArrayList,其中包含重复数据
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(2);
        arrayList.add(5);

        // 使用Iterator去除重复数据
        Set<Integer> uniqueSet = new HashSet<>();
        Iterator<Integer> iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            int element = iterator.next();
            if (!uniqueSet.add(element)) {
                iterator.remove();
            }
        }

        // 将Set中的元素重新添加到ArrayList中
        ArrayList<Integer> uniqueArrayList = new ArrayList<>(uniqueSet);

        // 打印去重后的ArrayList
        System.out.println(uniqueArrayList);
    }
}

结语

以上就是五种去除Java中ArrayList中重复数据的常用方法,每种方法都有其独特的优缺点。在实际应用中,我们可以根据具体情况选择最适合的方法。

常见问题解答

  1. 哪种方法去除重复数据最有效率?

    根据基准测试,Stream API方法通常是最有效率的。

  2. LinkedHashSet和HashSet有什么区别?

    LinkedHashSet保留元素的插入顺序,而HashSet则不保留。

  3. TreeSet是如何对元素进行排序的?

    TreeSet根据元素的自然顺序或比较器指定的顺序对元素进行排序。

  4. Stream API的distinct()方法是如何工作的?

    distinct()方法返回一个Stream,其中重复元素已移除。

  5. Iterator方法为什么不如其他方法有效率?

    Iterator方法需要逐个遍历ArrayList,这比使用集合类(如HashSet或TreeSet)的效率要低。