Java TreeMap排序基于删除重复值的值

时间:2016-07-16 14:13:20

标签: java sorting hashmap comparator treemap

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进行排序

3 个答案:

答案 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。