2015-11-26 3 views
1

Я пытаюсь сначала отсортировать HashMap по значению (целое), а затем по ключу (строке). Следующий метод, похоже, не правильно сортирует хэш-карту. Любые идеи, как заставить его работать правильно?Java HashMap сортировать по значению, тогда ключ

private static Map<String, Integer> sortHash(Map<String, Integer> map) { 
    List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); 

    // Sort list by integer values then by string keys 
    Collections.sort(list, (a, b) -> { 
     int cmp1 = a.getValue().compareTo(b.getValue()); 
     if (cmp1 != 0) 
      return cmp1; 
     else 
      return a.getKey().compareTo(b.getKey()); 
    }); 

    Map<String, Integer> result = new HashMap<>(); 
    for (Map.Entry<String, Integer> entry : list) 
     result.put(entry.getKey(), entry.getValue()); 

    return result; 
} 
+0

Лучшей реализацией вашего компаратора будет 'list.sort (Map.Entry.comparingByValue(). ThenComparing (Map.Entry.comparingByKey()))' –

+0

@LouisWasserman Должен ли я вызвать это после того, как я инициализирую свой список ? [Это] (https://i.gyazo.com/ce3ee598b13c5044f10d18771d56357c.png) - это то, что я вижу. Не уверен, что именно я скучаю. – dimitris93

+0

У вас не будет проблем, когда вы просто ставите свои результаты в HashMap, у которого нет гарантированного заказа? Я думаю, вам нужно посмотреть на TreeMap и снабдить компаратора. См. [Link] (http://stackoverflow.com/questions/2864840/treemap-sort-by-value) –

ответ

3

вопрос здесь:

Map<String, Integer> result = new HashMap<>(); 

Используйте LinkedHashMap, поскольку эта карта будет поддерживать порядок добавления пар ключ/значение.

+0

Вы правы. Я не знал об этом. Спасибо. – dimitris93

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