Есть ли способ поместить элементы списка в массив String в java? Я отсортировал карту по значению, используя собственный компаратор, и теперь пытаюсь поместить ключевые (String) элементы в массив. Единственный способ, который я нашел, - это циклически проходить по массиву и отсортированному списку одновременно и заполнять массив таким образом, но он помещает в него только последний элемент.
Пример: Моя карта без сортировки: {a=5, b=2, c=8, d=1}
После сортировки с помощью специального компаратора: [c=8, a=5, b=2, d=1]
Теперь мне просто нужно ввести значения ключей (c,a
et c.) к кортежу final String[] lettersWithBigValues = new String[n]
, где n
- длина кортежа.
Однако после:
for (int i = 0; i < Integer.parseInt(args[1]); i++) {
System.out.println(lettersWithBigValues[i]+",");
}
Консоль возвращает: d,d,d,d
при условии, что аргумент строки консоли равен 4
Вот полная функция:
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;
}
Где записи - это список данных, считанных из файла CSV.
А вот и компаратор:
public Comparator<Map.Entry<String, Integer>> valueComparator = (o1, o2) -> {
Integer v1 = o1.getValue();
Integer v2 = o2.getValue();
return v2.compareTo(v1);
};