How can I sort the keys of a Map in Java?
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.
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.
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.
}