您的位置:

Java List去重详解

一、Set集合去重

Set接口继承了 Collection 接口,Set 集合中的元素不按特定的方式排序,并且没有重复的元素。因此,可以使用 Set 接口来去除 List 中的重复元素。下面是示例代码:

List list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("banana");
list.add("orange");

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

System.out.println(list);

   
  

输出结果为: [orange, apple, banana]

上面的代码中,我们首先定义了一个ArrayList,并向里面添加了若干个元素,其中 banana 重复了两次。接着,我们生成了一个 HashSet 集合,调用addAll()方法将 list 集合的元素添加到 HashSet 集合中,由于Set集合中不允许重复,因此就去重了。最后将去重后的Set集合元素以列表的形式返回到原来的 list 集合中。

二、Map去重

Map中的键是唯一的,因此我们可以使用Map来实现List去重,将重复的元素作为键,不存入值,最后将键以列表的形式输出即可。

List list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("banana");
list.add("orange");

Map
    map = new HashMap<>();
for (String str : list) {
    map.put(str, new Object());
}
list.clear();
list.addAll(map.keySet());

System.out.println(list);

   
  

输出结果为: [orange, apple, banana]

上面的代码中,我们首先定义了一个ArrayList,并向里面添加了若干个元素,其中 banana 重复了两次。接着,我们生成了一个 HashMap 集合,并将 list 集合中的所有元素作为键,不存入值。由于HashMap中的键是唯一的,因此就去重了。最后将去重后的键以列表的形式返回到原来的 list 集合中。

三、使用Java 8 Lambda表达式去重

Java 8引入的 Lambda 表达式是一种更加简洁方便的写法,我们可以使用Lambda表达式来简化List去重操作。

List list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("banana");
list.add("orange");

list = list.stream().distinct().collect(Collectors.toList());

System.out.println(list);

  

输出结果为: [orange, apple, banana]

上述代码使用了 stream().distinct().collect(Collectors.toList()) 的语法,很容易理解,其中 stream 表示返回一个流,distinct()表示去重,collect(Collectors.toList())表示将流转换成一个列表。

四、使用TreeSet去重

将List转换成Set时,一般使用HashSet,但HashSet的顺序是不可预测的。如果想让去重后的List有一定的排序规则,可以使用 TreeSet。

List list = new ArrayList<>();
list.add("banana");
list.add("orange");
list.add("apple");
list.add("banana");

Set
    set = new TreeSet<>();
set.addAll(list);

list.clear();
list.addAll(set);

System.out.println(list);

   
  

输出结果为: [apple, banana, orange]

上述代码中,我们将List转换成 TreeSet,并将去重后的元素添加到原来的List中。TreeSet 会为元素进行排序,所以最后的输出结果是一个排序后的 List。

五、使用LinkedHashSet去重

LinkedHashSet 是 HashSet 的子类,在 HashSet 的基础上为元素维护了插入顺序,因此也可以用来去重并保留元素的顺序。

List list = new ArrayList<>();
list.add("banana");
list.add("orange");
list.add("apple");
list.add("banana");

Set
    set = new LinkedHashSet<>();
set.addAll(list);

list.clear();
list.addAll(set);

System.out.println(list);

   
  

输出结果为: [banana, orange, apple]

上述代码中,我们将List转换成 LinkedHashSet,并将去重后的元素添加到原来的List中。LinkedHashSet 会按元素插入的顺序保留元素,并且去重。因此,最后的输出结果是一个按照插入顺序排序后的 List。

六、使用Apache Commons Collections去重

Apache Commons Collections 是一个开源的 Java 类库,提供了一系列的数据结构和算法的实现,可以用来拓展 Java 的集合框架。这个集合库中也提供了一些去重操作的工具。下面是示例代码:

List list = new ArrayList<>();
list.add("banana");
list.add("orange");
list.add("apple");
list.add("banana");

List
    results = new ArrayList<>(new LinkedHashSet<>(list));

System.out.println(results);

   
  

输出结果为: [banana, orange, apple]

上述代码中,我们使用了 Apache Commons Collections 的 LinkedHashSetList 类,它是一个链式散列集合,它维护元素插入的顺序,并且不含重复元素。我们将原来的 List 传入 LinkedHashSetList 中,即可实现去重并保留元素的顺序。