2014-01-10 3 views
5
HashMap<String,Integer> map = new HashMap<String,Integer>(); 
map.put("a", 4); 
map.put("c", 6); 
map.put("b", 2); 

Желаемая выход (HashMap):Как сортировать HashMap по целочисленное значение

c : 6 
a : 4 
b : 2 

Я не смог найти ничего о нисходящее порядка по значению.
Как это можно достичь? (Дополнительный класс не является предпочтительным)

+1

Вы не можете. Но вы можете сортировать * Записи * (один раз в списке или другой упорядоченной коллекции) по значению: для запуска, 'List entries = new ArrayList > (hash.getEntries())'; затем сортируйте это. – user2864740

+0

@RC Это не тот же вопрос .. – GameDevGuru

+1

(Хотя я считаю, что это «дубликат», принятый ответ в другом вопросе довольно ужасный - прочитайте все ответы. Я также рекомендую использовать список [Массив] vs LinkedHashMap как выходная коллекция.) – user2864740

ответ

18

Попробуйте это:

HashMap<String, Integer> map = new HashMap<String, Integer>(); 
map.put("a", 4); 
map.put("c", 6); 
map.put("b", 2); 
Object[] a = map.entrySet().toArray(); 
Arrays.sort(a, new Comparator() { 
    public int compare(Object o1, Object o2) { 
     return ((Map.Entry<String, Integer>) o2).getValue() 
        .compareTo(((Map.Entry<String, Integer>) o1).getValue()); 
    } 
}); 
for (Object e : a) { 
    System.out.println(((Map.Entry<String, Integer>) e).getKey() + " : " 
      + ((Map.Entry<String, Integer>) e).getValue()); 
} 

выход:

c : 6 
a : 4 
b : 2 
+0

Это ставит ключ, значение пары как отдельный объект в массиве, я должен иметь возможность извлекать ключ, значения отдельно после сортировки – GameDevGuru

+0

Он помещает Map.Entry вы можете извлечь ключ и значение из него отдельно, см. Выше –

1

Одной из характеристик элементов Hash является их особая скорость при выполнении операций, таких как добавление, удаление и т. Д., И это происходит именно потому, что они используют алгоритмы Hash, что означает, что они не сохраняют порядок элементов, которые мы знаем как восходящие или потоковые. Это означает, что с структурами данных Hash вы не достигнете того, чего хотите.

+2

Было бы очень большое предложение иметь в виду, однако оно не отвечает на вопрос. – Ashish

+0

Вместо того, чтобы говорить, что это невозможно, как насчет того, чтобы предлагать сначала использовать его как ArrayList .. – GameDevGuru

+0

@ user2864740 Список intList = new ArrayList (map); , а затем работает со списком. Или что-то в этом роде. – GameDevGuru

4

Вы не можете разведать сортировку HashMap, но можете сортировать записи. Может быть что-то, как это помогает:

// not yet sorted 
List<Integer> intList = new ArrayList<Integer>(map.values()); 

Collections.sort(intList, new Comparator<Integer>() { 

    public int compare(Integer o1, Integer o2) { 
     // for descending order 
     return o2 - o1; 
    } 
}); 
+0

Я считаю, что OP хочет иметь ключ и значение вместе, однако результат используется. – user2864740

+1

Это отделяет ключ от значения без желаемого результата. – GameDevGuru

+0

Это правда, я полагал, что он распечатывал их или что-то в этом роде, поэтому все, что ему нужно было сделать, это сделать метод, который вызывает map.getKey (значение) и возвращает строку ...или что ему нужно. –

Смежные вопросы