1

I am trying to sort a HashMap first by value (integer) then by key (string). The following method doesn't appear to be sorting the hashmap properly. Any ideas how to make it work properly ?

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;
}
dimitris93
  • 4,155
  • 11
  • 50
  • 86
  • A better implementation of your comparator would be `list.sort(Map.Entry.comparingByValue().thenComparing(Map.Entry.comparingByKey()))` – Louis Wasserman Nov 26 '15 at 19:43
  • @LouisWasserman Would i have to call this after i initialize my list ? [This](https://i.gyazo.com/ce3ee598b13c5044f10d18771d56357c.png) is what I am seeing. Not sure what exactly I am missing. – dimitris93 Nov 26 '15 at 19:48
  • Will you not have a problem where you are just putting your results into a HashMap which has no guaranteed order? I think you'll need to look at TreeMap and supply a comparator to that. See [link](http://stackoverflow.com/questions/2864840/treemap-sort-by-value) – Egg Vans Nov 26 '15 at 20:42

1 Answers1

3

The issue is here:

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

Use LinkedHashMap since this map will maintain the order of the addition of the key/value pairs.

Luiggi Mendoza
  • 85,076
  • 16
  • 154
  • 332