es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comparando todas las combinaciones de elementos en una Colección a través de la API de Streams.

Estoy intentando comparar todas las combinaciones (es decir, sin comparaciones duplicadas) de elementos en un HashMap y devolver una lista de todos los elementos de dicho HashMap que satisfagan la función de comparación, utilizando el API de Streams de Java 8.

Es decir, quiero algo como esto:

// seudocódigo, este no es el trabajo del HashMap, pero espero que se entienda el punto
para(int i=0; i<myhashmap.entryset().length, i++)=”” para(int=”” j=”i+1,”></myhashmap.entryset().length,><myhashmap.entryset().length) {
si(mycomparison(entryset.get(i), entryset.get(j)))
mylist.add(new myclass[] {entryset.get(i), entryset.get(j)})
}

pero utilizando el api de streams. tengo una versión que casi funciona usando .foreach e iterando simplemente dos veces sobre el stream, sin embargo, esto tiene el problema de ejecutar comparaciones duplicadas y, por lo tanto, agregar esas duplicaciones a la lista de nuevo. estoy bastante seguro de que el operador reduce es capaz de lo que necesito, pero no estoy familiarizado con el api de streams en absoluto y no puedo entender cómo lograr el resultado deseado. {=”” si(mycomparison(entryset.get(i),=”” entryset.get(j)))=”” mylist.add(new=”” myclass[]=”” {entryset.get(i),=”” entryset.get(j)})=”” }=”” pero=”” utilizando=”” el=”” api=”” de=”” streams.=”” tengo=”” una=”” versión=”” que=”” casi=”” funciona=”” usando=”” .foreach=”” e=”” iterando=”” simplemente=”” dos=”” veces=”” sobre=”” el=”” stream,=”” sin=”” embargo,=”” esto=”” tiene=”” el=”” problema=”” de=”” ejecutar=”” comparaciones=”” duplicadas=”” y,=”” por=”” lo=”” tanto,=”” agregar=”” esas=”” duplicaciones=”” a=”” la=”” lista=”” de=”” nuevo.=”” estoy=”” bastante=”” seguro=”” de=”” que=”” el=”” operador=”” reduce=”” es=”” capaz=”” de=”” lo=”” que=”” necesito,=”” pero=”” no=”” estoy=”” familiarizado=”” con=”” el=”” api=”” de=”” streams=”” en=”” absoluto=”” y=”” no=”” puedo=”” entender=”” cómo=”” lograr=”” el=”” resultado=””></myhashmap.entryset().length) {
si(mycomparison(entryset.get(i), entryset.get(j)))
mylist.add(new myclass[] {entryset.get(i), entryset.get(j)})
}

pero utilizando el api de streams. tengo una versión que casi funciona usando .foreach e iterando simplemente dos veces sobre el stream, sin embargo, esto tiene el problema de ejecutar comparaciones duplicadas y, por lo tanto, agregar esas duplicaciones a la lista de nuevo. estoy bastante seguro de que el operador reduce es capaz de lo que necesito, pero no estoy familiarizado con el api de streams en absoluto y no puedo entender cómo lograr el resultado deseado.>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puedes usar el operador flatMap para lograr el resultado deseado. El operador flatMap toma un flujo de elementos y produce un flujo de elementos a partir de los elementos del flujo original. En este caso, puedes usar flatMap para crear un flujo de todas las combinaciones de elementos en el HashMap y luego usar el operador filter para filtrar los elementos que satisfacen la función de comparación. Finalmente, puedes usar el operador collect para recopilar los elementos en una List.

    Aquí tienes un ejemplo de cómo puedes usar el operador flatMap para lograr el resultado deseado:

    java
    List<myclass[]> myList = myHashMap.entrySet().stream()
    .flatMap(entry1 -> myHashMap.entrySet().stream()
    .filter(entry2 -> myComparison(entry1, entry2))
    .map(entry2 -> new MyClass[] {entry1, entry2}))
    .collect(Collectors.toList());
    </myclass[]>

Comments are closed.