Сортировка HashMaps по значению - PullRequest
3 голосов
/ 07 февраля 2012

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

Например: Сортировать карту <Ключ, Значение> по значениям (Java)

Мой вопрос: зачем это делать? Почему бы не создать TreeMap (который отсортирован по ключам), а затем отсортировать его по значению?

Ответы [ 4 ]

2 голосов
/ 07 февраля 2012

Если вы знаете, что ваши значения уникальны, вы можете использовать Guava's BiMap (двунаправленная карта) для хранения данных. Создайте HashBiMap так же, как ваш HashMap, затем создайте новый TreeMap из его инверсии:

new TreeMap<>(biMap.inverse());

Эта карта будет затем отсортирована по значениям. Помните, что то, что вы называете «ключами» и «ценностями», поменяется местами.

Если ваши значения не являются уникальными, вы можете создать мультикарту обратного. Мультикарта - это, по сути, отображение каждого ключа на одно или несколько значений. Обычно это делается путем создания карты из ключа к списку. Вам не обязательно делать это, потому что Google сделал это для вас. Просто создайте мультикарту из вашей существующей карты и попросите Guava инвертировать ее для вас в TreeMultimap, который, как вы можете догадаться, представляет собой TreeMap, который может содержать несколько значений на ключ.

Multimaps.invertFrom(Multimaps.forMap(myMap), new TreeMultimap<V, K>());

Предоставляется многокарточная документация.

2 голосов
/ 07 февраля 2012

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

Я собираюсь выбросить Карта, которая может быть повторена в порядке значений как еще один ответ на вопрос «Как это сделать», хотя ... в частности, решение, которое не возвращает карта, которая задыхается (создавая исключения) при запросах к ключам, не относящимся к исходной карте.

1 голос
/ 10 мая 2016

Я написал следующую однострочную строку, используя Java 8 Stream API для сортировки любой заданной карты по значению:

List<Map.Entry<String, String>> sortedEntries = map.entrySet().stream()
  .sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue())).collect(Collectors.toList());
1 голос
/ 27 апреля 2016

У меня есть очень маленький код, который отлично работает:

public class SortMapByValues {
    public static void main(String[] args) {

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

        myMap.put(100, "hundread");
        myMap.put(500, "fivehundread");
        myMap.put(250, "twofifty");
        myMap.put(300, "threehundread");
        myMap.put(350, "threefifty");
        myMap.put(400, "fourhundread");

        myMap = sortMapByValues(myMap);

        for (Map.Entry<Integer, String> entry : myMap.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }

    }

    public static Map<Integer, String> sortMapByValues(
            Map<Integer, String> firstMap) {
        Map<String, Integer> SecondyMap = new TreeMap<String, Integer>();

        for (Map.Entry<Integer, String> entry : firstMap.entrySet()) {
            SecondyMap.put(entry.getValue(), entry.getKey());
        }
        firstMap.clear();
        for (Map.Entry<String, Integer> entry : SecondyMap.entrySet()) {
            firstMap.put(entry.getValue(), entry.getKey());
        }
        return firstMap;
    }

}

Выход:

500 fivehundread  
400 fourhundread  
100 hundread  
350 threefifty  
300 threehundread  
250 twofifty 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...