public class A{
TreeMap<String, Double> sortedPairList;
HashMap<String, Double> PairList = new HashMap<String, Double>();
public static void main(String[] args) {
A p = new A();
p.PairList.put("a00", 0.3920948902348);
p.PairList.put("a01", 0.4920948902348);
p.PairList.put("a02", 0.3420948902348);
p.PairList.put("a03", 0.5920948902348);
p.PairList.put("a04", 0.6720948902348);
p.PairList.put("a05", 0.3940948902348);
p.PairList.put("a06", 0.3920948902348);
p.PairList.put("a07", 0.9920948902348);
p.PairList.put("a08", 0.6920948902348);
p.PairList.put("a09", 0.7920948902348);
p.PairList.put("a10", 0.8820948902348);
p.PairList.put("a11", 0.1220948902348);
p.PairList.put("a12", 0.1920948902348);
p.PairList.put("a13", 0.4520948902348);
p.PairList.put("a14", 0.3434948902348);
p.PairList.put("a15", 0.5690948902348);
p.PairList.put("a16", 0.5920948902348);
p.PairList.put("a17", 0.8920948902348);
p.PairList.put("a18", 0.920948902348);
p.PairList.put("a19", 0.9820948902348);
p.PairList.put("a20", 0.1920948902348);
p.PairList.put("a21", 0.5920948902348);
p.PairList.put("a22", 0.3920948902348);
p.PairList.put("a23", 0.3920948902348);
p.sortPairList(p.PairList) ;
for(String s : p.sortedPairList.keySet() ){
System.out.println("key:: value: " + s + " ::"+p.sortedPairList.get(s));
}
}//end of main
public void sortPairList(HashMap<String, Double> pairlist) {
ValueComparator comp = new ValueComparator(pairlist);
sortedPairList = new TreeMap<String, Double>(comp);
sortedPairList.putAll(pairlist);
}// end of sortedPredicatePairList
class ValueComparator implements Comparator<Object> {
Map<String, Double> temp;
public ValueComparator(Map<String, Double> base) {
this.temp = base;
}
public int compare(Object p1, Object p2) {
if ((Double) temp.get(p1) < (Double) temp.get(p2)) {
return 1;
} else if ((Double) temp.get(p1) == (Double) temp.get(p2)) {
return 0;
} else {
return -1;
}
}
}// end of class ValueComparator
}//end of classA
*我得到的输出如下,为什么我在重复的值中得到空值: *
key :: value:a07 :: 0.9920948902348
key :: value:a19 :: 0.9820948902348
key :: value:a18 :: 0.920948902348
key :: value:a17 :: 0.8920948902348
key :: value:a10 :: 0.8820948902348
key :: value:a09 :: 0.7920948902348
key :: value:a08 :: 0.6920948902348
key :: value:a04 :: 0.6720948902348
key :: value:a03 :: 0.5920948902348
key :: value:a21 :: null
key :: value:a16 :: null
key :: value:a15 :: 0.5690948902348
key :: value:a01 :: 0.4920948902348
key :: value:a13 :: 0.4520948902348
key :: value:a05 :: 0.3940948902348
key :: value:a06 :: 0.3920948902348
key :: value:a23 :: 0.3920948902348
key :: value:a22 :: 0.3920948902348
key :: value:a00 :: null
key :: value:a14 :: 0.3434948902348
key :: value:a02 :: 0.3420948902348
key :: value:a12 :: 0.1920948902348
key :: value:a20 :: null
key :: value:a11 :: 0.1220948902348
答案 0 :(得分:3)
来自Tree Map API:
请注意,如果此有序映射要正确实现Map接口,则由有序映射维护的排序(无论是否提供显式比较器)必须与equals一致。 (请参阅Comparable或Comparator以获得与equals一致的精确定义。)这是因为Map接口是根据equals操作定义的,但是map使用compareTo(或compare)方法执行所有键比较,因此有两个键从排序映射的角度来看,这种方法被认为是相等的。
你的ValueComparator肯定与equals不一致。
不知何故,p.sortedPairList.keySet()
包含根据您的“ValueComparator”“等于”的键,但是您为重复键获得了null
。
答案 1 :(得分:2)
像这样声明PairList
:
HashMap<String, Double> PairList = new HashMap<String, Double>();
将您的ValueComparator#compare
方法更改为:
public int compare(Object p1, Object p2) {
return temp.get(p1).compareTo(temp.get(p2));
}
更新根据您的评论,使用compare
方法按升序获取所有24个元素:
public int compare(String p1, String p2) {
if (temp.get(p1).doubleValue() < temp.get(p2).doubleValue())
return 1;
else if (temp.get(p1).doubleValue() == temp.get(p2).doubleValue())
return p1.compareTo(p2);
else
return -1;
}
答案 2 :(得分:0)
该错误存在于您的比较器中。
在java中,您无法使用==
运算符比较对象。这个操作符可以满足你的期望。因此,要比较您在地图中保存的双打值,您必须调用doubleValue()
。这是我的比较器版本正常工作。
public int compare(Object p1, Object p2) {
if (temp.get(p1).doubleValue() < temp.get(p2).doubleValue()) {
return 1;
} else if (temp.get(p1).doubleValue() == temp.get(p2).doubleValue()) {
return 0;
} else {
return -1;
}
}
答案 3 :(得分:0)
这是因为您在比较器中与==
符号进行比较。用equals()
方法替换它,它应该工作:
public int compare(Object p1, Object p2) {
if ((Double) temp.get(p1) < (Double) temp.get(p2)) {
return 1;
} else if (((Double) temp.get(p1)).equals((Double) temp.get(p2))) {
return 0;
} else {
return -1;
}
}