在資料流中尋找重複元素是 Java 面試甚至許多學生考試中常見的問題之一。 Java提供了多種尋找重複元素的方法,我們主要關注兩種方法:第一種是使用Java Collection Framework的Set,另一種是使用流的內建方法Collections.Frequency()。
在討論從資料集合中取得重複項的不同方法之前,有必要先討論一下filter()方法。它將是範例程式的重要組成部分。
它允許我們根據指定的條件對流的元素進行過濾。它是高階函數的一部分,用於對流項應用某種行為。此方法將謂詞作為參數並傳回與謂詞相符的元素清單。
filter(predicate);
它是Java Collection Interface的子接口,不允許重複值。它與數學集合非常相似。我們可以使用 add() 方法,該方法僅將那些不相似的元素新增至集合。要使用Set介面的屬性,我們需要使用實作該介面的HashSet類別。
以下範例說明如何使用 Set 介面從流中尋找重複元素。
使用 Arrays.asList() 方法建立一個清單來儲存固定大小的清單。
然後,使用 HashSet 類別定義一個 Set,以只儲存不相似的元素。
現在,使用filter()方法以及stream()和forEach()來只過濾掉重複的項目。這裡,stream()以流的形式指定輸入,我們將使用forEach()來迭代並列印重複的元素。
import java.util.*; public class Duplicate { public static void main(String []args) { // create a list with duplicate items List<Integer> itemsList = Arrays.asList(10, 12, 10, 33, 40, 40, 61, 61); // declaring a new Set Set<Integer> newitemSet = new HashSet<>(); System.out.println("The list of duplicate Items: "); itemsList.stream() // converting list to stream .filter(nums -> !newitemSet.add(nums)) // to filter out the elementsthat are not added to the set .forEach(System.out::println); // print the duplicates } }
The list of duplicate Items: 10 40 61
從流或集合中過濾重複元素的另一種最簡單方法是使用「java.util」套件的 Collections.Frequency() 方法,該方法用於傳回指定集合中的元素總數。
Collections.frequency(nameOfCollection, obj);
在這裡,
nameOfCollection表示流,obj表示需要確定頻率的元素。
在下面的範例中,我們將使用 Collections.Frequency() 方法來統計流中每個元素的出現次數,然後傳回出現次數超過一次的元素。我們將列印重複元素出現的整個清單以及計數。
import java.util.*; public class FindDuplicates { public static void main(String[] args) { // create a list with duplicate items List<Integer> itemslist = Arrays.asList(10, 12, 10, 10, 33, 40, 40, 61, 61); System.out.println("The list of duplicate Items with frequency: "); itemslist.stream() // converting list to stream .filter(itr -> Collections.frequency(itemslist, itr) > 1) // checking the frequency of duplicate items .forEach(System.out::println); // printing the frequency of duplicate items System.out.println("Count of duplicate items: "); // to count the duplicate items System.out.println(itemslist.stream() .filter(itr -> Collections.frequency(itemslist, itr) > 1) .count()); } }
The list of duplicate Items with frequency: 10 10 10 40 40 61 61 Count of duplicate items: 7
這是另一個範例,我們將同時使用 Set Interface 和 Collections.Frequency() 方法來只取得重複元素。 Collections.Frequency() 方法將對流中每個元素的出現次數進行計數,然後將計數大於 1 的元素收集到 Set 中以刪除重複項。產生的 Set 將只包含流中的重複元素。
import java.util.stream.*; import java.util.*; public class FindDuplicates { public static void main(String[] args) { // create a list with duplicate items List<Integer> itemslist = Arrays.asList(10, 12, 10, 10, 33,40, 40, 61, 61); // set to store duplicate items Set<Integer> duplicates = itemslist.stream() .filter(itr -> Collections.frequency(itemslist, itr) > 1) // checking the frequency of duplicate items .collect(Collectors.toSet()); // adding only duplicate items to set // printing the duplicate items System.out.println("The list of duplicate Items:" + duplicates); } }
The list of duplicate Items:[40, 10, 61]
在本節中,我們將以上述範例和概念中的一些要點來結束我們的討論。我們可以使用filter()方法從資料集合中過濾掉特定類型的元素。它透過對每個元素應用謂詞來在背景工作。 Set Interface 能夠僅儲存不同的元素,這使其成為給定任務的絕佳選擇。
以上是如何在Java中尋找流中的重複元素的詳細內容。更多資訊請關注PHP中文網其他相關文章!