一、概述
在編程中,經常需要對數據進行比較和處理,而對兩個或多個列表取交集是一種常見的需求。在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類型的對象,並按照原有的順序進行排序,得到最終結果。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/231542.html