import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
public class Main {
public static void main
(String[] args
) {
map.put("My", "World!");
map.put("Hello", "World!");
map.put("This", "World!");
map.put("Test", "X!");
System.
out.
println("The original map: " + map
);
// sort the
SortedSet
<Map.
Entry<String, String
>> sorted
= entriesSortedByValues
(map
);
// print the value based sorted set
System.
out.
println("The sorted set: " + sorted
);
// check that for example the first element is in the set
if (!sorted.contains(sorted.iterator().next()))
}
static <K,V
extends Comparable
<? super V
>> SortedSet
<Map.
Entry<K,V
>> entriesSortedByValues
(Map
<K,V
> map
) { SortedSet
<Map.
Entry<K,V
>> sortedEntries
= new TreeSet
<Map.
Entry<K,V
>>( new Comparator
<Map.
Entry<K,V
>>() { @Override
public int compare
(Map.
Entry<K,V
> e1,
Map.
Entry<K,V
> e2
) { int res = e1.getValue().compareTo(e2.getValue());
return res != 0 ? res : 1; // Special fix to preserve items with equal values
}
}
);
sortedEntries.addAll(map.entrySet());
return sortedEntries;
}
}
aW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgIAkKICAgIAltYXAucHV0KCJNeSIsICJXb3JsZCEiKTsKICAgIAltYXAucHV0KCJIZWxsbyIsICJXb3JsZCEiKTsKICAgIAltYXAucHV0KCJUaGlzIiwgIldvcmxkISIpOwogICAgCW1hcC5wdXQoIlRlc3QiLCAiWCEiKTsKICAgIAkKICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBvcmlnaW5hbCBtYXA6ICIgKyBtYXApOwoKICAgIAkvLyBzb3J0IHRoZSAKICAgIAlTb3J0ZWRTZXQ8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gc29ydGVkID0gZW50cmllc1NvcnRlZEJ5VmFsdWVzKG1hcCk7CgogICAgCS8vIHByaW50IHRoZSB2YWx1ZSBiYXNlZCBzb3J0ZWQgc2V0CiAgICAJU3lzdGVtLm91dC5wcmludGxuKCJUaGUgc29ydGVkIHNldDogICAiICsgc29ydGVkKTsKICAgIAkKICAgICAgICAvLyBjaGVjayB0aGF0IGZvciBleGFtcGxlIHRoZSBmaXJzdCBlbGVtZW50IGlzIGluIHRoZSBzZXQKICAgIAlpZiAoIXNvcnRlZC5jb250YWlucyhzb3J0ZWQuaXRlcmF0b3IoKS5uZXh0KCkpKQogICAgICAgIAl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIHNldCBkb2Vzbid0IGNvbnRhaW4gdGhlIGZpcnN0IGVsZW1lbnQ/Iik7CiAgICB9CiAgICAKICAgIHN0YXRpYyA8SyxWIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFY+PiBTb3J0ZWRTZXQ8TWFwLkVudHJ5PEssVj4+IGVudHJpZXNTb3J0ZWRCeVZhbHVlcyhNYXA8SyxWPiBtYXApIHsKICAgICAgICBTb3J0ZWRTZXQ8TWFwLkVudHJ5PEssVj4+IHNvcnRlZEVudHJpZXMgPSBuZXcgVHJlZVNldDxNYXAuRW50cnk8SyxWPj4oCiAgICAgICAgICAgIG5ldyBDb21wYXJhdG9yPE1hcC5FbnRyeTxLLFY+PigpIHsKICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IGNvbXBhcmUoTWFwLkVudHJ5PEssVj4gZTEsIE1hcC5FbnRyeTxLLFY+IGUyKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IGUxLmdldFZhbHVlKCkuY29tcGFyZVRvKGUyLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMgIT0gMCA/IHJlcyA6IDE7IC8vIFNwZWNpYWwgZml4IHRvIHByZXNlcnZlIGl0ZW1zIHdpdGggZXF1YWwgdmFsdWVzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgICAgIHNvcnRlZEVudHJpZXMuYWRkQWxsKG1hcC5lbnRyeVNldCgpKTsKICAgICAgICByZXR1cm4gc29ydGVkRW50cmllczsKICAgIH0KfQ==