首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于值去重值的Java TreeMap排序

基于值去重值的Java TreeMap排序
EN

Stack Overflow用户
提问于 2016-07-16 22:13:20
回答 3查看 1.6K关注 0票数 0
代码语言:javascript
复制
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));
  }

}

问题:它根据值正确排序,但删除了重复的值。能请谁指出原因吗?

当前输出:

代码语言:javascript
复制
yellow 32 
red  23 
orange  1 

预期输出:

代码语言:javascript
复制
yellow 32 
red  23 
green  23
orange  1 

我在TreeMap中使用了Comparator,它根据值对HashMap进行排序

EN

回答 3

Stack Overflow用户

发布于 2016-07-16 22:21:03

TreeMapComparator用于比较密钥。这里的变通方法基本上告诉映射"red""green"是相同的键,因此它丢弃了其中的一个。

您可以查看here,了解如何按值对映射进行排序。

票数 2
EN

Stack Overflow用户

发布于 2016-07-17 01:25:41

找到了一个解决方案,如果它能帮助别人的话,

为了避免丢失键,在compare方法中,检查两个值是否相等,即compare方法返回零,如果是,则对键进行排序并返回,

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-11-14 02:40:37

您可以通过自己显式地返回compare函数中的值来解决此问题。例如,您可以通过以下方式修改compare函数:

代码语言:javascript
复制
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即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38412060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档