¿Hay una manera de poner elementos de la lista a una matriz de cadenas en Java? Me lo solucionaron un mapa de valor utilizando una costumbre Comparador y ahora tratando de poner la llave (String) elementos en una matriz. La única manera que he encontrado es un bucle a través de la matriz y la lista ordenada al mismo tiempo y llenar la matriz de esa manera, sino que sólo pone el último elemento en ella.
Ejemplo: Mi mapa sin clasificar: {a=5, b=2, c=8, d=1}
Después ordenados con el comparador de encargo: [c=8, a=5, b=2, d=1]
Ahora sólo tendrá que poner los valores clave ( c,a
etc.) a la tupla final String[] lettersWithBigValues = new String[n]
donde n
es la longitud de la tupla.
Sin embargo, después de:
for (int i = 0; i < Integer.parseInt(args[1]); i++) { System.out.println(lettersWithBigValues[i]+","); }
La consola da vuelta: d,d,d,d
dado que el argumento de la línea de la consola es 4
Esta es la función completa:
public String[] getTopLettersWithValues(final int n){
final String[] lettersWithBigValues = new String[n];
final Map<String, Integer> myMap = new HashMap<>();
int counter = 0;
for (final List<String> record : records) {
if (!myMap.containsKey(record.get(1))) {
myMap.put(record.get(1), counter += Integer.parseInt(record.get(4)));
} else {
myMap.computeIfPresent(record.get(1), (k,v) -> v + Integer.parseInt(record.get(4)));
}
}
System.out.println(myMap);
List<Map.Entry<String, Integer>> sorted = new LinkedList<>(myMap.entrySet());
// Sort list with list.sort(), using a custom Comparator
sorted.sort(valueComparator);
System.out.println(sorted);
for (int i = 0; i < lettersWithBigValues.length; i++) {
for (Map.Entry<String, Integer> values: sorted) {
lettersWithBigValues[i] = values.getKey();
}
}
return lettersWithBigValues;
}
Cuando los registros es una lista de los datos leídos desde un archivo csv.
Y aquí está el comparador:
public Comparator<Map.Entry<String, Integer>> valueComparator = (o1, o2) -> {
Integer v1 = o1.getValue();
Integer v2 = o2.getValue();
return v2.compareTo(v1);
};
Puede alcanzar el conjunto de teclas de la siguiente manera:
String [] lettersWithBigValues = myMap.entrySet().stream() // entries of your intial map
.sorted(valueComparator) // sorted by your comparator
.map(Map.Entry::getKey) // mapped to only the key e.g. 'd', 'a'
.toArray(String[]::new); // converted to array