java treeMap 排序后 get不到value

代码如下importjava.util.*;publicclassmain{publicstaticvoidmain(String[]args){HashMap<Stri... 代码如下

import java.util.*;

public class main {

public static void main(String[] args) {

HashMap<String,Double> map = new HashMap<String,Double>();

ValueComparator bvc = new ValueComparator(map);

TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);

map.put("A",99.5);

map.put("B",67.4);

map.put("C",67.4);

map.put("D",67.3);

System.out.println("unsorted map: "+map);

sorted_map.putAll(map);

System.out.println("results: "+sorted_map);

Iterator it = sorted_map.keySet().iterator();

while (it.hasNext()) {

//it.next()得到的是key,tm.get(key)得到obj

System.out.println(sorted_map.get(it.next()));

}

}

}

class ValueComparator implements Comparator<String> {

Map<String, Double> base;

public ValueComparator(Map<String, Double> base) {

this.base = base;

}

// Note: this comparator imposes orderings that are inconsistent with equals.

public int compare(String a, String b) {

if (base.get(a) >= base.get(b)) {

return -1;

} else {

return 1;

} // returning 0 would merge keys

}

}

打印出来的时
unsorted map: {D=67.3, A=99.5, B=67.4, C=67.4}

results: {A=99.5, C=67.4, B=67.4, D=67.3}
但是遍历sort_map却返回null
展开
 我来答
百度网友0b96ca2
2015-01-05 · 超过39用户采纳过TA的回答
知道小有建树答主
回答量:76
采纳率:0%
帮助的人:71.9万
展开全部

你想按照map的value进行排序,首先你的compare接口就是个错误的实现,一般会实现2个if分支,就是比较的值要求是返回3种情况-1,0,1。为啥要这样?如果你不这样做会产生很多bug,你去看看treemap的源码,在使用你自己实现的comparator借口进行比较的时候有

while (p != null) {
    int cmp = cpr.compare(k, p.key);
    if (cmp < 0)
        p = p.left;
    else if (cmp > 0)
        p = p.right;
    else
        return p;
}

但是你自己实现的接口没有else那种情况,就是cmp=0那种情况,所以永远得不到key对应的value了。


你的问题有两种方法解决在你的comapre方法改为

public int compare(String a, String b) {
    if (base.get(a) > base.get(b)) {
        return -1;
    } else if (base.get(a) < base.get(b)){
        return 1;
    }else{
        return  0;
    }
}

或者你取value的时候不通过get方法,而是通过

Set<Entry<String, Double>> set = sorted_map.entrySet();
for (Entry<String, Double> i : set) {
    System.out.println(i.getValue());
}
尚硅谷
2016-01-21 · 挤进尚硅谷,注定你优秀
尚硅谷
"尚硅谷"教育自成立以来,发展迅猛,凭借优秀的教学团队、前沿的课程体系、务实的教育理念,现已成为有口皆碑的IT培训品牌。
向TA提问
展开全部
TreeMap中排序是依据compareTo()或者compare()方法中重写的标准实现的。如果返回值为0,则添加不成功。同样的,获取指定属性对应的value值,也是使用的compareTo()或者compare()方法。所以要看添加到map中的key,再通过get()方法获取同样key对应的value时,是不是重写的方法不合适,导致返回的int值不为0了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
51CTO学院
2015-11-20 · 中国最大的IT实战在线培训平台
51CTO学院
中国最大的IT实战在线教育培训平台。
向TA提问
展开全部
get不到value很可能是由于key不对,检查一下大小写,一般treemap排序后是根据key升序排列的。
分析你的程序发现:实现的时候缺少了一个分支,修改为如下:
while (p != null) {
int cmp = cpr.compare(k, p.key);
if (cmp < 0)
p = p.left;
else if (cmp > 0)
p = p.right;
else
return p;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhongtyler
2015-01-05 · TA获得超过4408个赞
知道大有可为答主
回答量:4384
采纳率:79%
帮助的人:907万
展开全部
你的compare做错了,compare是比较key,而不是比较value。你现在的做法,不会返回相符和的key,所以无法用key找到value。

public int compare(String a, String b) {
return a.compareTo(b);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式