如何在Java中的 Stream 中查找重复元素
给定一个包含一些元素的流,任务是在Java中找到该流中的重复元素。
例子:
Input: Stream = {5, 13, 4, 21, 13, 27, 2, 59, 59, 34}
Output: [59, 13]
Explanation:
The only duplicate elements in the given stream are 59 and 13.
Input: Stream = {5, 13, 4, 21, 27, 2, 59, 34}
Output: []
Explanation:
There are no duplicate elements in the given stream, hence the output is empty.
有很多方法可以在 Stream 中查找重复元素:
- 使用 Set:由于 Set 具有不能包含任何重复元素的属性。因此,如果我们在 Set 中添加元素,它会在添加自身时自动丢弃重复的元素。
方法:
- 获取要在其中找到重复项的元素流。
- 遍历流的每个元素
- 对于流中的每个元素,如果它不存在于集合中,则添加它。这可以使用 Set.add() 方法来完成。
Set.add()
- 如果该元素已经存在于 Set 中,则此 Set.add() 返回 false。
- 因此,我们可以打印这些元素或收集它们以进行进一步处理。在这种情况下,我们将打印这些元素。
下面是上述方法的实现:
例子:
// Java program to find the duplicate // elements in a Stream using Set import java.util.*; import java.util.stream.*; public class GfG { // Function to find the // duplicates in a Stream public static
Set findDuplicateInStream(Stream stream) { // Set to store the duplicate elements Set items = new HashSet<>(); // Return the set of duplicate elements return stream // Set.add() returns false // if the element was // already present in the set. // Hence filter such elements .filter(n -> !items.add(n)) // Collect duplicate elements // in the set .collect(Collectors.toSet()); } // Driver code public static void main(String[] args) { // Initial stream Stream stream = Stream.of(5, 13, 4, 21, 13, 27, 2, 59, 59, 34); // Print the found duplicate elements System.out.println( findDuplicateInStream(stream)); } } 输出:[59, 13]
- 使用 Collectors.groupingBy(): Java中 Collectors 类的groupingBy()方法通过某些属性对对象进行分组。所以我们将传递冗余属性并将结果收集到一个集合中。
方法:
- 获取要在其中找到重复项的元素流。
- 遍历流的每个元素
- 对于流中的每个元素,使用 Collectors.groupingBy() 方法将它们与它们在地图中的频率一起分组。
stream.collect( Collectors.groupingBy(Function.identity(), Collectors.counting()));
- 那么对于采集到的map中的每一个元素,如果任何一个元素出现的频率大于1,那么这个元素就是一个重复元素。
- 因此,我们可以打印这些元素或收集它们以进行进一步处理。在这种情况下,我们将打印这些元素。
下面是上述方法的实现:
例子:
// Java program to find the duplicate // elements in a Stream using Collectors.groupingBy() import java.util.*; import java.util.stream.*; import java.util.function.Function; public class GfG { // Function to find the // duplicates in a Stream public static
Set findDuplicateInStream(Stream stream) { // Return the set of duplicate elements return stream // Group the elements along // with their frequency in a map .collect( Collectors.groupingBy( Function.identity(), Collectors.counting())) // Convert this map into a stream .entrySet() .stream() // Check if frequency > 1 // for duplicate elements .filter(m -> m.getValue() > 1) // Find such elements .map(Map.Entry::getKey) // And Collect them in a Set .collect(Collectors.toSet()); } // Driver code public static void main(String[] args) { // Initial stream Stream stream = Stream.of(5, 13, 4, 21, 13, 27, 2, 59, 59, 34); // Print the found duplicate elements System.out.println( findDuplicateInStream(stream)); } } 输出:[59, 13]
- 使用 Collections.frequency(): Java中 Collections 类的frequency()方法,计算给定列表中指定元素的频率。因此,我们将找出频率大于 1 的元素,即重复元素。
方法:
- 获取要在其中找到重复项的元素流。
- 遍历流的每个元素
- 对于流中的每个元素,使用 Collections.frequency() 方法计算每个元素的频率。
Collections.frequency(list, i)
- 那么对于集合列表中的每个元素,如果任何元素出现的频率大于1,那么这个元素就是重复元素。
- 因此,我们可以打印这些元素或收集它们以进行进一步处理。在这种情况下,我们将打印这些元素。
下面是上述方法的实现:
例子:
// Java program to find the duplicate // elements in a Stream // using Collections.frequency() import java.util.*; import java.util.stream.*; public class GfG { // Function to find the // duplicates in a Stream public static
Set findDuplicateInStream(List list) { // Return the set of duplicate elements return // Get the stream from the list list.stream() // Count the frequency of each element // and filter the elements // with frequency > 1 .filter(i -> Collections.frequency(list, i) > 1) // And Collect them in a Set .collect(Collectors.toSet()); } // Driver code public static void main(String[] args) { // Initial stream List list = Arrays.asList(5, 13, 4, 21, 13, 27, 2, 59, 59, 34); // Print the found duplicate elements System.out.println( findDuplicateInStream(list)); } } 输出:[59, 13]