我创建了一个地图,然后对值进行排序并将它们放在TreeMap中。但问题是当我在Treemap上调用remove()方法时,该元素不会被删除。 有谁知道问题是什么?
这是我的代码:
Map<String , Double> map=new HashMap<String, Double>();
TreeMap<String, Double> sortedItems = sortMap(map);
sortedItems.remove("I put the key here as a string");
public TreeMap<String, Double> sortMap(Map<String, Double> map) {
HashMap<String, Double> map2 = new HashMap<String, Double>(map);
TreeMap<String, Double> sortedMap = SortByValue(map2);
return sortedMap;
}
public TreeMap<String, Double> SortByValue
(HashMap<String, Double> map) {
ValueComparator vc = new ValueComparator(map);
TreeMap<String, Double> sortedMap = new TreeMap<String, Double>(vc);
sortedMap.putAll(map);
return sortedMap;
}
class ValueComparator implements Comparator<String> {
Map<String, Double> map;
public ValueComparator(Map<String, Double> base) {
this.map = base;
}
public int compare(String a, String b) {
if (map.get(a) >= map.get(b)) {
return -1;
} else {
return 1;
} // returning 0 would merge keys
}
答案 0 :(得分:1)
返回0会合并密钥
返回0表示元素相等。如果你不返回0,元素永远不会相等。您的TreeMap
使用了给定的Comparator
到put
和remove
。您的Comparator
永远不会将两个密钥标识为相等,因此无法删除任何内容。
答案 1 :(得分:1)
你需要返回0;当你期待一场比赛。解决这个问题的方法是比较它所匹配的密钥。这样,相同的密钥将匹配,但只有相同的密钥。
public int compare(String a, String b) {
int cmp = -map.get(a).compareTo(map.get(b));
if (cmp == 0)
cmp = a.compareTo(b);
return cmp;
}
这样,如果它们是不同的字符串,那么映射到同一个Double的字符串键将被视为不同。