Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write a custom Comparator for TreeMap in Java?

I want to store key-value pairs in TreeMap and sort the entries based on the value of Key as per following logic:

Sort by the length of the key. If the length of two keys is same then sort them alphabetically. Example, for the following key-value pairs.

IBARAKI MitoCity
TOCHIGI UtunomiyaCity
GUNMA MaehashiCity
SAITAMA SaitamaCity
CHIBA ChibaCity
TOKYO Sinjyuku
KANAGAWA YokohamaCity

The expected output is like this.

CHIBA : ChibaCity
GUNMA : MaehashiCity
TOKYO : Sinjyuku
IBARAKI : MitoCity
SAITAMA : SaitamaCity
TOCHIGI : UtunomiyaCity
KANAGAWA : YokohamaCity
like image 947
ZINLIN HTET Avatar asked Oct 17 '25 04:10

ZINLIN HTET


1 Answers

You can pass the Comparator as a parameter to Map's constructor. According to documentation it is used for Keys only:

/**
 * Constructs a new, empty tree map, ordered according to the given
 * comparator.  All keys inserted into the map must be <em>mutually
 * comparable</em> by the given comparator: {@code comparator.compare(k1,
 * k2)} must not throw a {@code ClassCastException} for any keys
 * {@code k1} and {@code k2} in the map.  If the user attempts to put
 * a key into the map that violates this constraint, the {@code put(Object
 * key, Object value)} call will throw a
 * {@code ClassCastException}.
 *
 * @param comparator the comparator that will be used to order this map.
 *        If {@code null}, the {@linkplain Comparable natural
 *        ordering} of the keys will be used.
 */
public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
}

In this way you can pass comparator by length of your key like this:

new TreeMap<>(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()))
like image 55
Naya Avatar answered Oct 18 '25 18:10

Naya



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!