How can I sort Map values by key in Java?

dictionary, hashmap, java

Solution

Short answer

Use a `TreeMap`. This is precisely what it's for.

If this map is passed to you and you cannot determine the type, then you can do the following:

SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) { 
   String value = map.get(key);
   // do something
}

This will iterate across the map in natural order of the keys.

Longer answer

Technically, you can use anything that implements `SortedMap`, but except for rare cases this amounts to `TreeMap`, just as using a `Map` implementation typically amounts to `HashMap`.

For cases where your keys are a complex type that doesn't implement Comparable or you don't want to use the natural order then `TreeMap` and `TreeSet` have additional constructors that let you pass in a `Comparator`:

// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
        ...
    }

SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());

Remember when using a `TreeMap` or `TreeSet` that it will have different performance characteristics than `HashMap` or `HashSet`. Roughly speaking operations that find or insert an element will go from O(1) to O(Log(N)).

In a `HashMap`, moving from 1000 items to 10,000 doesn't really affect your time to lookup an element, but for a `TreeMap` the lookup time will be about 1.3 times slower (assuming Log2). Moving from 1000 to 100,000 will be about 1.6 times slower for every element lookup.

Problem

I have a Map that has strings for both keys and values. The data is like the following: "question1", "1" "question9", "1" "question2", "4" "question5", "2" I want to sort the map based on its keys. So, in the end, I will have `question1, question2, question3`, and so on. Eventually, I am trying to get two strings out of this Map: - First String: Questions (in order 1 .. 10) - Second String: Answers (in the same order as the question) Right now I have the following: ``` Iterator it = paramMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry pairs = (Map.Entry) it.next(); questionAnswers += pairs.getKey() + ","; } ``` This gets me the questions in a string, but they are not in order.

Original source

Related problems