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 展开
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 展开
展开全部
你想按照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());
}
展开全部
TreeMap中排序是依据compareTo()或者compare()方法中重写的标准实现的。如果返回值为0,则添加不成功。同样的,获取指定属性对应的value值,也是使用的compareTo()或者compare()方法。所以要看添加到map中的key,再通过get()方法获取同样key对应的value时,是不是重写的方法不合适,导致返回的int值不为0了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
}
分析你的程序发现:实现的时候缺少了一个分支,修改为如下:
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的compare做错了,compare是比较key,而不是比较value。你现在的做法,不会返回相符和的key,所以无法用key找到value。
public int compare(String a, String b) {
return a.compareTo(b);
}
public int compare(String a, String b) {
return a.compareTo(b);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询