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 我在TreeMap中使用了Comparator,它根据值对HashMap进行排序
发布于 2016-07-16 22:21:03
TreeMap的Comparator用于比较密钥。这里的变通方法基本上告诉映射"red"和"green"是相同的键,因此它丢弃了其中的一个。
您可以查看here,了解如何按值对映射进行排序。
发布于 2016-07-17 01:25:41
找到了一个解决方案,如果它能帮助别人的话,
为了避免丢失键,在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;
}发布于 2018-11-14 02:40:37
您可以通过自己显式地返回compare函数中的值来解决此问题。例如,您可以通过以下方式修改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即可。
https://stackoverflow.com/questions/38412060
复制相似问题