Сортировать карту в порядке возрастания по ключу - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь отсортировать карту в порядке возрастания на основе ключей.Учитывая Map:

Map<Integer, String> map = new LinkedHashMap<Integer, String>();

map.put(5, "five");
map.put(1, "one");
map.put(3, "three");
map.put(0, "zero");

Я хотел бы заказать:

0, zero
1, one
3, three
5, five

Я написал следующий код для выполнения этого:

    public <K, V extends Comparable<? super V>> Map<K, V> sortByKeyInAscendingOrder(Map<K, V> map)
{
    List<Entry<K, V>> list = new ArrayList<>(map.entrySet());
    list.sort(Entry.comparingByKey());

    Map<K, V> result = new LinkedHashMap<>();
    for (Entry<K, V> entry : list) {
        result.put(entry.getKey(), entry.getValue());
    }
    return result;
}

Однако,когда я звоню sort(), я получаю следующую ошибку:

The method sort(Comparator<? super Map.Entry<K,V>>) in the type List<Map.Entry<K,V>> is not applicable for the arguments (Comparator<Map.Entry<Comparable<? super Comparable<? super K>>,Object>>)

Я написал похожий код (который работает нормально) для сортировки по значению (изменив Entry.comparingByKey() на Entry.comparingByValue()), но по какой-то причинепри попытке сортировки по ключу я получаю вышеуказанную ошибку.

Как я могу это исправить?

Спасибо

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Вы также можете попробовать использовать потоки Java 8

Map<Integer, String> map = new LinkedHashMap<Integer, String>();

    map.put(5, "five");
    map.put(1, "one");
    map.put(3, "three");
    map.put(0, "zero");

    map = map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

    System.out.println(map);  //{0=zero, 1=one, 3=three, 5=five}

Или вы можете использовать forEach на Map

map.forEach((k,v)->System.out.println(k+"  "+v));
0 голосов
/ 23 января 2019

Вам нужно сделать K сопоставимым для сортировки по нему; и ограничение на V неверно (но все равно не обязательно).

public <K extends Comparable<? super K>, V> Map<K, V> sortByKeyInAscendingOrder(Map<K, V> map)

Имейте в виду, более простой способ может быть:

return new LinkedHashMap<>(new TreeMap<>(map));

Или

return map.entrySet().stream()
    .sorted(Entry.comparingKey())
    .collect(toMap(k -> k, v -> v, LinkedHashMap::new));
0 голосов
/ 23 января 2019

Как насчет использования TreeMap? ключи хранятся в порядке:

https://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

Если вам нужно создать ее из существующей карты, используйте ее параметризованный конструктор:

TreeMap<Integer,String> treeMap = new TreeMap<>(map);

потому что использование HashMap не гарантирует порядок, а LinkedHashMap поддерживает порядок вставки. Чтобы сохранить карту отсортированной по ключу, используйте TreeMap.

0 голосов
/ 23 января 2019

Для метода comparingByKey требуется, чтобы его ключ, параметр типа K был равен Comparable, а не (обязательно) его значению, V.

Перемещение границы ? extends Comparable<? super K> с V на K. Изменение

<K, V extends Comparable<? super K>>

до

<K extends Comparable<? super K>, V>

Конечно, необязательно также иметь V быть Comparable, но сделать эту границу относящейся к себе, а не к K:

V extends Comparable<? super V>
...