一、概述
在编程中,经常需要对数据进行比较和处理,而对两个或多个列表取交集是一种常见的需求。在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类型的对象,并按照原有的顺序进行排序,得到最终结果。