TreeMap сортировка по значению

Ожидание в блоке catch теперь возможно в отношении предварительного просмотра Roslyn конечного пользователя, как показано здесь (в списке в списке «Ожидание в catch / finally») и будет включено в C # 6.

В приведенном примере указан

try … catch { await … } finally { await … }

Обновление: добавлена ​​новая ссылка и что она будет в C # 6

119
задан Matthias Braun 13 March 2018 в 14:43
поделиться

3 ответа

У вас не может быть TreeMap сама сортирует значения, поскольку это противоречит спецификации SortedMap :

A Map , которая дополнительно обеспечивает полное упорядочение на своих ключах ].

Однако, используя внешнюю коллекцию, вы всегда можете отсортировать Map.entrySet () , как хотите, по ключам, значениям или даже по их комбинации (!!).

Вот общий метод, который возвращает SortedSet of Map.Entry , учитывая Map , значения которого равны Comparable :

static <K,V extends Comparable<? super V>>
SortedSet<Map.Entry<K,V>> entriesSortedByValues(Map<K,V> map) {
    SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
        new Comparator<Map.Entry<K,V>>() {
            @Override public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
                int res = e1.getValue().compareTo(e2.getValue());
                return res != 0 ? res : 1;
            }
        }
    );
    sortedEntries.addAll(map.entrySet());
    return sortedEntries;
}

Теперь вы можете сделать следующее:

    Map<String,Integer> map = new TreeMap<String,Integer>();
    map.put("A", 3);
    map.put("B", 2);
    map.put("C", 1);   

    System.out.println(map);
    // prints "{A=3, B=2, C=1}"
    System.out.println(entriesSortedByValues(map));
    // prints "[C=1, B=2, A=3]"

Обратите внимание, что неприятные вещи произойдут, если вы попытаетесь изменить либо сам SortedSet , либо Map.Entry внутри, потому что это не больше "вид" исходной карты, такой как entrySet () .

Вообще говоря, необходимость сортировать записи карты по их значениям нетипична.


Примечание к == для Integer

Ваш исходный компаратор сравнивает Integer с помощью == . Это почти всегда неверно, поскольку == с операндами Integer является ссылочным равенством, а не равенством значений.

    System.out.println(new Integer(0) == new Integer(0)); // prints "false"!!!

Связанные вопросы

167
ответ дан 24 November 2019 в 01:05
поделиться

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

Если вам нужны отсортированные значения, вы должны извлечь их в Список и отсортировать его.

14
ответ дан 24 November 2019 в 01:05
поделиться

Это невозможно сделать с помощью компаратора , так как он всегда будет получать ключ карты для сравнения. TreeMap может сортировать только по ключу.

10
ответ дан 24 November 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: