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.

Filtrar lista de Mapas basándose en la clave utilizando Java Streams.

Hay una Lista<><string,string>>, como se muestra a continuación:

[
{“A”: “ABC”,”B”: “ABCD”,”C”: “0.945”},
{“A”: “ABC”,”B”: “AB”,”C”: “0.871”},
{“A”: “XYZ”,”B”: “XYZA”,”C”: “0.765”},
{“A”: “ABC”,”B”: “ABD”,”C”: “0.945”},
{“A”: “XYZ”,”B”: “XYZB”,”C”: “0.563”}
]

Pregunta:

Filtra la lista anterior para obtener un Mapa donde la clave es ‘A’ y el valor más alto de ‘C’ para ese ‘A’.

{
“ABC”: “0.945”,
“XYZ”: “0.765”
}

Código inicial:

Map<string, string=””> m0 = new HashMap<>();
m0.put(“A”, “ABC”);
m0.put(“B”, “ABCD”);
m0.put(“C”, “0.945”);

Map<string, string=””> m1 = new HashMap<>();
m1.put(“A”, “ABC”);
m1.put(“B”, “AB”);
m1.put(“C”, “0.871”);

Map<string, string=””> m2 = new HashMap<>();
m2.put(“A”, “XYZ”);
m2.put(“B”, “XYZA”);
m2.put(“C”, “0.765”);

Map<string, string=””> m3 = new HashMap<>();
m3.put(“A”, “ABC”);
m3.put(“B”, “ABD”);
m3.put(“C”, “0.945”);

Map<string, string=””> m4 = new HashMap<>();
m4.put(“A”, “XYZ”);
m4.put(“B”, “XYZB”);
m4.put(“C”, “0.563”);

List<><string,string>> res = Arrays.asList(m0,m1,m2,m3,m4);

Puedo obtener:

[{A=ABC, B=ABCD, C=0.945}, {A=XYZ, B=XYZA, C=0.765}]

Usando el siguiente código:

List<><string, string=””>> result = res.stream().collect(Collectors.groupingBy(map->map.get(“A”)))
.entrySet().stream().map(m -> m.getValue().stream()
.max(Comparator.comparingDouble(s -> Double.parseDouble(s.get(“C”)))).get())
.collect(Collectors.toList())</string,></string,string></string,></string,></string,></string,></string,></string,string>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para filtrar la lista anterior y obtener un mapa donde la clave sea ‘A’ y el valor más alto de ‘C’ para esa ‘A’, podemos modificar el código de la siguiente manera:

    Map<string, double=""> maxValues = res.stream()
            .collect(Collectors.groupingBy(
                map -> map.get("A"),
                Collectors.mapping(
                    map -> Double.parseDouble(map.get("C")),
                    Collectors.maxBy(Double::compare)
                )
            ))
            .entrySet().stream()
            .filter(entry -> entry.getValue().isPresent())
            .collect(Collectors.toMap(
                entry -> entry.getKey(),
                entry -> entry.getValue().get().toString()
            ));
    

    Aquí, primero usamos groupingBy para agrupar los mapas según su clave ‘A’. Dentro de cada grupo, usamos otro colector para obtener el valor máximo de ‘C’. Luego convertimos el mapa resultante en otro mapa, donde las claves son los valores de ‘A’ y los valores son los correspondientes valores máximos de ‘C’. Finalmente, filtramos cualquier entrada donde el valor máximo no esté presente (es decir, el grupo estaba vacío) y convertimos las entradas resultantes en un mapa con toMap. El resultado final es:

    {"ABC":"0.945", "XYZ":"0.765"}</string,>

Comments are closed.