Mefisto_Fell:
Hola todos los que trabajan con las corrientes, había una pregunta. Tengo una hoja que quiero para ordenar por la frecuencia de ocurrencia de los personajes en él:
List<String> frequency = new ArrayList<>();
Collections.addAll(frequency, "gg", "ss", "gg", "boy", "girls", "girls", "gg", "boy", "aa", "aa");
Escribí este método:
return words.stream().limit(limit).map(String::toLowerCase)
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
.entrySet().stream()
.map(entry -> new Pair<>(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
Pero la respuesta ya se muestra no es correcta, la cadena a se pierde por completo, el gg cadena es uno de los elementos, y los chicos es un elemento
ss=1
gg=2
girls=2
boy=1
Y no sé cómo clasificarlas por frecuencia de aparición. El resultado debe ser como este:
gg=3
aa=2
boy=2
girls=2
ss=1
¿Cómo se puede mejorar?
Ravindra Ranwala:
Puede hacerlo como tal,
Map<String, Long> wordCount = frequency.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.sorted(Map.Entry.<String, Long>comparingByValue(Comparator.reverseOrder())
.thenComparing(Map.Entry.comparingByKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(e1, e2) -> e2, LinkedHashMap::new));
Salida: {gg=3, aa=2, boy=2, girls=2, ss=1}
Tenga en cuenta que la mergeFunction NO se usa aquí, ya que no existen conflictos de clave.