Как поместить элементы списка в массив строк в Java - PullRequest
1 голос
/ 17 марта 2020

Есть ли способ поместить элементы списка в массив 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);
    };

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Вы можете получить массив ключей следующим образом:

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
0 голосов
/ 17 марта 2020

В качестве дополнительного предложения вы могли бы также создать Comparator, используя метод Entry.comparingByValue().

Comparator<Entry<String,Integer>> valueComparator = 
                Entry.<String,Integer>comparingByValue().reversed();

Возвращает готовый Comparator, который сравнивается по естественному порядку значения. Поэтому для сортировки в обратном порядке вам просто нужно пометить метод reversed(), который определен в интерфейсе Comparator.

0 голосов
/ 17 марта 2020

Мне кажется, что вы по ошибке использовали вложенное значение для l oop, вам просто нужно:

for (int i = 0; i < lettersWithBigValues.length; i++) {
     lettersWithBigValues[i] = sorted.get(i).getKey();
}

Это вернуло бы массив: c, a, b, d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...