I have a problem about finding key value with respect to value by using comparing with each item in Map List in Java.
If multiple key values with the same value, I want to get the highest character value. If all key values are different, I want to get a key with the highest value.
Here is my screenshot shown below.
p/11 a/16 -> Here is the result s/12 d/10 u/13 b/20 c/20 -> Here is the result d/1
I have a problem in compare part which I cannot handle with.
How can I fix my issue?
Here is my code snippet shown below.
Map.Entry<Character, Integer> maxEntry = null; for(Map.Entry<Character, Integer> entry : list.entrySet()){ if (maxEntry == null || (entry.getKey() .compareTo(maxEntry.getKey()) >= 0 && entry.getValue() .compareTo(maxEntry.getValue()) >= 0)) { maxEntry = entry; } System.out.println(entry.getKey() + "/" + entry.getValue()); } return maxEntry.getKey();
Advertisement
Answer
Assuming you have a map Map<Character,Integer>
and want to return a Character
, taking your sample input as an example:
Map<Character,Integer> map1 = Map.of('p', 11, 'a', 16, 's', 12, 'd', 10, 'u', 13); Map<Character,Integer> map2 = Map.of('b',20, 'c',20, 'd', 1);
you can use stream.max()
which takes a comparator, where you could pass a comparator composed by a value-comparator and key-comparator using Comparator.thenComparing
:
import java.util.Comparator; import java.util.Map; import java.util.Map.Entry; .... public static Character getMax(Map<Character,Integer> myMap) { Comparator<Entry<Character,Integer>> byKey = Entry.comparingByKey(); Comparator<Entry<Character,Integer>> byValue = Entry.comparingByValue(); return myMap.entrySet() .stream() .max(byValue.thenComparing(byKey)) .map(Entry::getKey) .orElse(null); }