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>
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:
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 contoMap
. El resultado final es:{"ABC":"0.945", "XYZ":"0.765"}
</string,>