public class Solution {
public static void main(String[] args) {
HashMap<String,Integer> hm = new HashMap<>();
hm.put("red",23);
hm.put("orange",1);
hm.put("yellow",32);
hm.put("green",23);
TreeMap<String,Integer> tm = new TreeMap<>(new ValueComparator(hm));
tm.putAll(hm);
for(String key : tm.keySet())
System.out.println(key+" "+tm.get(key));
}
}
class ValueComparator implements Comparator<String>{
Map<String, Integer> map;
public ValueComparator(Map<String, Integer> map){
this.map =map;
}
public int compare(String a, String b){
return map.get(b).compareTo(map.get(a));
}
}
问题:它根据值正确排序,但正在删除重复值。可以请有人指出原因。
当前输出:
yellow 32
red 23
orange 1
预期产出:
yellow 32
red 23
green 23
orange 1
我在Comparator
内使用TreeMap
,然后根据值
HashMap
进行排序
答案 0 :(得分:2)
Comparator
的{{1}}用于比较键。这里的解决方法基本上告诉地图TreeMap
和"red"
是相同的键,因此它删除了其中一个。
您可以查看here有关如何按值对地图进行排序的信息。
答案 1 :(得分:0)
找到解决方案,如果它可以帮助他人,
为避免键被删除,在compare方法中,检查两个值是否相等,即compare方法返回零,如果是,则对键进行排序并返回,
public int compare(String a, String b){
int compare = map.get(a).compareTo(map.get(b));
if (compare == 0) {
compare = a.compareTo(b);
}
return compare;
}
答案 2 :(得分:0)
您可以通过自己显式返回compare函数中的值来解决此问题。例如,在这里您可以按以下方式修改比较功能:
public int compare(String a, String b) {
if (map.get(b).compareTo(map.get(a)) >= 0) {
return 1;
} else {
return -1;
}
}
treeMap比较器无法理解值0。因此,如果值相同,则可以只返回1或-1。