Cómo encontrar elementos duplicados en un Stream en Java

Dado un flujo que contiene algunos elementos, la tarea es encontrar los elementos duplicados en este flujo en Java .

Ejemplos:

Entrada: Corriente = {5, 13, 4, 21, 13, 27, 2, 59, 59, 34}
Salida: [59, 13]
Explicación:
Los únicos elementos duplicados en la corriente dada son 59 y 13.

Entrada: Flujo = {5, 13, 4, 21, 27, 2, 59, 34}
Salida: []
Explicación:
No hay elementos duplicados en el flujo dado, por lo que la salida está vacía.

Hay muchos métodos para encontrar elementos duplicados en un Stream :

  1. Usando Set : Dado que Set tiene la propiedad de que no puede contener ningún elemento duplicado. Entonces, si agregamos los elementos en un Conjunto, automáticamente descarta los elementos duplicados mientras se agrega.

    Acercarse:

    • Obtenga el flujo de elementos en los que se encuentran los duplicados.
    • Atraviesa cada elemento de la corriente
    • Para cada elemento de la secuencia, si no está presente en el conjunto, agréguelo. Esto se puede hacer usando el método Set.add() .
      Set.add()
    • Si el elemento ya está presente en el Conjunto, entonces este Set.add() devuelve falso.
    • Por lo tanto, podemos imprimir dichos elementos o recopilarlos para su posterior proceso. Imprimiremos estos elementos en este caso.

    A continuación se muestra la implementación del enfoque anterior:

    Ejemplo:

    // 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 <T> Set<T>
        findDuplicateInStream(Stream<T> stream)
        {
      
            // Set to store the duplicate elements
            Set<T> 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<Integer> stream
                = Stream.of(5, 13, 4,
                            21, 13, 27,
                            2, 59, 59, 34);
      
            // Print the found duplicate elements
            System.out.println(
                findDuplicateInStream(stream));
        }
    }
    Producción:

    [59, 13]
    
  2. Usando Collectors.groupingBy() : El método groupingBy() de la clase Collectors en Java agrupa los objetos por alguna propiedad. Así que pasaremos la propiedad de redundancia y recogeremos el resultado en un Conjunto.

    Acercarse:

    • Obtenga el flujo de elementos en los que se encuentran los duplicados.
    • Atraviesa cada elemento de la corriente
    • Para cada elemento de la transmisión, agrúpelos junto con su frecuencia en un mapa, usando el método Collectors.groupingBy() .
      stream.collect(
          Collectors.groupingBy(Function.identity(), 
          Collectors.counting())); 
      
    • Luego, para cada elemento en el mapa recopilado, si la frecuencia de cualquier elemento es más de uno, entonces este elemento es un elemento duplicado.
    • Por lo tanto, podemos imprimir dichos elementos o recopilarlos para su posterior proceso. Imprimiremos estos elementos en este caso.

    java-collection-framework-fundamentals-self-paced

    A continuación se muestra la implementación del enfoque anterior:

    Ejemplo:

    // 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 <T> Set<T>
        findDuplicateInStream(Stream<T> 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<Integer> stream
                = Stream.of(5, 13, 4,
                            21, 13, 27,
                            2, 59, 59, 34);
      
            // Print the found duplicate elements
            System.out.println(
                findDuplicateInStream(stream));
        }
    }
    Producción:

    [59, 13]
    
  3. Usando Collections.frequency() : El método de frecuencia() de la clase Collections en Java, cuenta la frecuencia del elemento especificado en la lista dada. Entonces encontraremos los elementos que tienen una frecuencia mayor a 1, que son los elementos duplicados.

    Acercarse:

    • Obtenga el flujo de elementos en los que se encuentran los duplicados.
    • Atraviesa cada elemento de la corriente
    • Para cada elemento en la transmisión, cuente la frecuencia de cada elemento, usando el método Collections.frequency() .
      Collections.frequency(list, i) 
      
    • Luego, para cada elemento en la lista de colección, si la frecuencia de cualquier elemento es más de uno, entonces este elemento es un elemento duplicado.
    • Por lo tanto, podemos imprimir dichos elementos o recopilarlos para su posterior proceso. Imprimiremos estos elementos en este caso.

    A continuación se muestra la implementación del enfoque anterior:

    Ejemplo:

    // 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 <T> Set<T>
        findDuplicateInStream(List<T> 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<Integer> list
                = Arrays.asList(5, 13, 4,
                                21, 13, 27,
                                2, 59, 59, 34);
      
            // Print the found duplicate elements
            System.out.println(
                findDuplicateInStream(list));
        }
    }
    Producción:

    [59, 13]
    

Publicación traducida automáticamente

Artículo escrito por SHUBHAMSINGH10 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *