Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a SortedMap in Java with a custom Comparator

Tags:

I want to create a TreeMap in Java with a custom sort order. The sorted keys which are string need to be sorted according to the second character. The values are also string.

Sample map:

Za,FOO Ab,Bar 
like image 641
unj2 Avatar asked May 01 '10 03:05

unj2


People also ask

How do I add a comparator to TreeMap in Java?

SortedMap<String, Double> myMap = new TreeMap<String, Double>(new Comparator<Entry<String, Double>>() { public int compare(Entry<String, Double> o1, Entry<String, Double> o2) { return o1. getValue(). compareTo(o2. getValue()); } });

Can we use comparator with HashMap in Java?

Sort HashMap by Values using Comparator InterfaceTo sort the HashMap by values, we need to create a Comparator. It compares two elements based on the values. After that get the Set of elements from the Map and convert Set into the List.

What is SortedMap in Java?

SortedMap is an interface in the collection framework. This interface extends the Map interface and provides a total ordering of its elements (elements can be traversed in sorted order of keys).


1 Answers

You can use a custom comparator like this:

    Comparator<String> secondCharComparator = new Comparator<String>() {         @Override public int compare(String s1, String s2) {             return s1.substring(1, 2).compareTo(s2.substring(1, 2));         }                }; 

Sample:

    SortedMap<String,String> map =         new TreeMap<String,String>(secondCharComparator);     map.put("Za", "FOO");     map.put("Ab", "BAR");     map.put("00", "ZERO");     System.out.println(map); // prints "{00=ZERO, Za=FOO, Ab=BAR}" 

Note that this simply assumes that the String has a character at index 1. It throws StringIndexOutOfBoundsException if it doesn't.


Alternatively, you can also use this comparison:

return s1.charAt(1) - s2.charAt(1); 

This subtraction "trick" is broken in general, but it works fine here because the subtraction of two char will not overflow an int.

The substring andcompareTo solution above is more readable, though.

See also:

  • Java Integer: what is faster comparison or subtraction?
like image 166
polygenelubricants Avatar answered Sep 18 '22 06:09

polygenelubricants