This is a very basic question, I'm just not that good with Java. I have a Map and I want to get a list or something of the keys in sorted order so I can iterate over them.
4 Answers
Use a TreeMap
, which is an implementation of the SortedMap
interface. It presents its keys in sorted order.
Map<String, Object> map = new TreeMap<String, Object>();
/* Add entries to the map in any order. */
...
/* Now, iterate over the map's contents, sorted by key. */
for (Map.Entry<String, ?> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
If you are working with another Map implementation that isn't sorted as you like, you can pass it to the constructor of TreeMap
to create a new map with sorted keys.
void process(Map<String, Object> original) {
Map<String, Object> copy = new TreeMap<String, Object>(original);
/* Now use "copy", which will have keys in sorted order. */
...
}
A TreeMap
works with any type of key that implements the Comparable
interface, putting them in their "natural" order. For keys that aren't Comparable
, or whose natural ordering isn't what you need, you can implement your own Comparator
and specify that in the constructor.

- 265,237
- 58
- 395
- 493
-
The code I'm consuming gives me a Map object, so how do I then convert it into a TreeMap or use a TreeMap to do the sorting? – Bialecki Feb 20 '09 at 22:03
-
You can create the TreeMap using a constructor whose parameter is any Map. Also, congratulations erickson (I assume, since you're only 5 rep away from 10k). – Dan Lew Feb 20 '09 at 22:05
-
1You would better off sorting keys (place in a TreeSet) then calling get on the original Map. Creating a new TreeMap results in everything getting rehashed. – Steve Kuo Feb 21 '09 at 01:03
-
1Steve, that's incorrect. No hashing occurs with a TreeMap; it's a red-black tree. Anyway, a TreeSet delegates to an internal TreeMap, so creating a TreeSet, iterating over its keys, and using them to perform an O(log(n)) lookup in another tree would be confusing and inefficient. – erickson Feb 22 '09 at 04:06
You have several options. Listed in order of preference:
- Use a
SortedMap
:
SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
This is vastly preferable if you want to iterate more than once. It keeps the keys sorted so you don't have to sort them before iterating. - There is no #2.
- There is no #3, either.
SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);
The last two will get you what you want, but should only be used if you only want to iterate once and then forget the whole thing.

- 188,989
- 46
- 291
- 292
-
In step #4, you could also create a TreeSet (a sorted set) instead of a list, which saves you from making an explicit call to sort(). – David Z Feb 20 '09 at 22:08
-
@David: I did think of that, but for some reason I forgot that it was possible to iterate over a Set. It does require sorting every time, though. – Michael Myers Feb 20 '09 at 22:10
-
hmm i like the #4 . why does it require more sorting than #1 ? i would have thought it was equally good – Johannes Schaub - litb Feb 20 '09 at 22:14
-
@litb: If you're dumping the map into a TreeMap every time you want to iterate over it, then you're right, they are the same. – Michael Myers Feb 20 '09 at 22:17
-
#4 isn't as good as #1 if you need the values from the map too. Iterating over entries saves the extra lookup for the value. – erickson Feb 20 '09 at 22:28
You can create a sorted collection when iterating but it make more sense to have a sorted map in the first place. (As has already been suggested)
All the same, here is how you do it.
Map<String, Object> map;
for(String key: new TreeSet<String>(map.keySet()) {
// accessed in sorted order.
}

- 525,659
- 79
- 751
- 1,130
Apart from the methods mentioned in other answers, with Java 8 streams, another shorthand to get a sorted key list from a map would be -
List<T> sortedKeys = myMap.keySet().stream().sorted().collect(Collectors.toList());
One could actually get stuff done after .sorted()
as well (like using a .map(...)
or a .forEach(...)
), instead of collecting it in the list and then iterating over the list.