All keys inserted into a sorted map must implement the Comparable interface, such as String and Date objects.
So if your map's key is a String then you are all set.
But if your map's key is a user-defined object, then what should you do?
It's simple. Use a Comparator class for your map's key.
Here's a usage example.
Let's create a Person class.
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Create a Comparator for the Person class.
public class PersonComparator implements Comparator<Person> { public PersonComparator() {} public int compare(Person person1, Person person2) { String name1 = person1.getName().toUpperCase(); String name2 = person2.getName().toUpperCase(); //ascending order if ( (name1 == null || "".equals(name1.trim())) && (name2 == null || "".equals(name2.trim())) ) { //both names are empty return 0; } else if ( (name1 == null || "".equals(name1.trim())) ) { // first bean has no name -- second should come before return 1; } else if ( (name2 == null || "".equals(name2.trim())) ) { // second bean has no name -- first should come before return -1; } if (name1 != null && !"".equals(name1.trim()) && name2 != null && !"".equals(name2.trim())) { return name1.compareToIgnoreCase(name2); //use below for descending order - also change conditions above //return name2.compareToIgnoreCase(name1); } return 0; } }
Now, to have a sorted map with the Person class as the key, instantiate your map using the TreeMap constructor that accepts a Comparator argument - "TreeMap(Comparator<? super K> comparator)".
Here's the usage example.
public class TestSortedMap { public static void main(String[] args) { // instantiate a TreeMap Map<Person, String> personCityMap = new TreeMap<Person, String>(new PersonComparator()); map.put(new Person("Bianca", 18), "Torrance"); map.put(new Person("Raymond", 10), "Los Angeles"); map.put(new Person("Juancho", 14), "San Diego"); // print the Person's name and age (properties of map's key) and the city (map's value) for (Map.Entry<Person, String> entry : personCityMap.entrySet()) { System.out.println("Key : " + entry.getKey().getName() + " - " + entry.getKey().getAge() + " Value : " + entry.getValue()); } } }
The resulting map will be sorted by the Person.name property in ascending order.
Output.
Key: Bianca - 18 Value : Torrance Key: Juancho - 14 Value : San Diego Key: Raymond - 10 Value : Los Angeles
Resources:
Java TreeMap