Ashishkumar Singh:
Perdóname si la solución es muy obvio, pero me parece que no puede encontrar la manera de hacer esto
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("b1", "a1");
map.put("b2", "a2");
map.put("b3", "a1");
Map<String, List<String>> mm = map.values().stream().collect(Collectors.groupingBy(m -> m));
System.out.println(mm);
}
Quiero grupo por sobre la base de valores en HashMap. Quiero que la salida sea {a1=[b1, b3], a2=[b2]}
pero actualmente viene como{a1=[a1, a1], a2=[a2]}
Ousmane D .:
Actualmente, estás streaming a través de los valores de mapa (que supongo que es un error tipográfico), basado en su salida necesaria que debe transmitir sobre el mapa entrySet
y el uso groupingBy
basado en el valor del mapa de y mapping
como un colector aguas abajo sobre la base de la clave del mapa de:
Map<String, List<String>> result = map.entrySet()
.stream()
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey,
Collectors.toList())));
También podría realizar esta lógica sin una corriente a través de forEach
+ computeIfAbsent
:
Map<String, List<String>> result = new HashMap<>();
map.forEach((k, v) -> result.computeIfAbsent(v, x -> new ArrayList<>()).add(k));