【问题标题】:Java TreeMap sorting based on values removing duplicate values基于删除重复值的值的 Java TreeMap 排序
【发布时间】:2016-11-19 14:31:54
【问题描述】:
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 进行排序

【问题讨论】:

    标签: java sorting hashmap comparator treemap


    【解决方案1】:

    TreeMapComparator 用于比较。您在这里的解决方法基本上告诉地图 "red""green" 是相同的键,因此它删除了其中一个。

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

    【讨论】:

    • 感谢您的解释,我无法得到这背后的原因。
    【解决方案2】:

    如果对他人有帮助,请找到解决方案,

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

    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;
    }
    

    【讨论】:

    • 谢谢。我遇到了完全相同的问题。一个有趣且出乎意料的旁注,我没有意识到我在一些调试输出中发现的比较 - 它经常比较相同的键值对。我正在对三个值的列表进行排序,并且比较函数被调用了五次。这五次中有三次是比较对象 a 和 b 的完全相同的键值对。这肯定是使用的底层排序方法的结果。它还解释了为什么返回 0 不会将键、值对添加到最终集合中。整洁!
    【解决方案3】:

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

    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。

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 1970-01-01
      • 2015-01-23
      • 2016-10-04
      • 2023-03-10
      • 2019-06-19
      • 1970-01-01
      • 2018-06-06
      相关资源
      最近更新 更多