您的位置:

Javalist取交集

一、概述

在编程中,经常需要对数据进行比较和处理,而对两个或多个列表取交集是一种常见的需求。在Java中,我们可以使用Collections类提供的retainAll()方法很方便地实现两个列表的交集操作。

二、使用retainAll()方法取交集

retainAll()方法是集合类中的一个方法,它可以从一个集合中移除所有不包含在另一个集合中的元素,返回一个新的集合对象。使用retainAll()方法取两个列表的交集非常简单,只需要将一个列表作为参数传递给另一个列表的retainAll()方法即可。例如:

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

List<String> list2 = new ArrayList<String>();
list2.add("banana");
list2.add("orange");
list2.add("pear");

list1.retainAll(list2); // 取list1和list2的交集,list1变为["banana", "orange"]

System.out.println(list1); // 输出[banana, orange]

在上面的代码中,我们创建了两个字符串类型的列表list1和list2,然后分别向它们添加了不同的元素。使用list1.retainAll(list2)语句,我们取得了两个列表的交集,结果存储在了list1中。

三、实现取多个列表的交集

如果我们需要对多个列表取交集,我们可以使用类似上面的代码,分别将每个列表与交集进行处理。但是这种方式显然很繁琐,效率也不高。我们可以使用Java 8引入的新特性Stream,来实现对多个列表取交集的操作。

首先,我们需要将多个列表转换成Stream对象,然后使用reduce()方法和retainAll()方法将它们逐个取交集:

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

List<String> list2 = new ArrayList<String>();
list2.add("banana");
list2.add("orange");
list2.add("pear");

List<String> list3 = new ArrayList<String>();
list3.add("orange");
list3.add("pear");
list3.add("grape");

List<List<String>> lists = Arrays.asList(list1, list2, list3);

List<String> result = lists.stream()
                          .reduce((l1, l2) -> {
                                        l1.retainAll(l2);
                                        return l1;
                                     })
                          .orElse(new ArrayList<String>());

System.out.println(result); // 输出[orange]

在上面的代码中,我们创建了三个字符串类型的列表list1、list2和list3,然后创建了一个List<List<String>>类型的列表lists,将三个列表作为元素添加到其中。使用lists.stream()方法将它转换成一个Stream对象,然后使用reduce()方法和retainAll()方法,对它进行逐个的取交集操作,最终得到交集结果。

四、使用HashSet进行取交集操作

除了使用Java提供的retainAll()方法和Stream特性以外,我们还可以使用HashSet来实现对多个列表取交集的操作。

HashSet是Java中的一种存储Set元素的集合,它可以很方便地完成对集合元素的取交集、并集和差集等操作。通过HashSet的addAll()方法可以将多个列表转换成Set类型的对象,然后使用retainAll()方法进行交集操作,最终再将交集结果转换成List类型的对象,并按照原有的顺序进行排序。例如:

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

List<String> list2 = new ArrayList<String>();
list2.add("banana");
list2.add("orange");
list2.add("pear");

List<String> list3 = new ArrayList<String>();
list3.add("orange");
list3.add("pear");
list3.add("grape");

Set<String> set = new HashSet<String>();

set.addAll(list1);
set.retainAll(list2);
set.retainAll(list3);

List<String> result = new ArrayList<String>(set);
Collections.sort(result);

System.out.println(result); // 输出["orange"]

在上面的代码中,我们首先创建了三个字符串类型的列表list1、list2和list3,然后使用HashSet的addAll()方法将它们转换成了一个Set类型的对象。使用set.retainAll()方法进行交集操作,得到交集的结果。最后,将交集结果转换成一个List类型的对象,并按照原有的顺序进行排序,得到最终结果。