📜  如何在Java中的 Stream 中查找重复元素

📅  最后修改于: 2022-05-13 01:55:19.219000             🧑  作者: Mango

如何在Java中的 Stream 中查找重复元素

给定一个包含一些元素的,任务是在Java中找到该流中的重复元素。

例子:

有很多方法可以在 Stream 中查找重复元素:

  1. 使用 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]
    
  2. 使用 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]
    
  3. 使用 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]