TreeMap元素未删除

时间:2014-11-25 16:18:48

标签: java hashmap treemap

我创建了一个地图,然后对值进行排序并将它们放在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
    }

2 个答案:

答案 0 :(得分:1)

  

返回0会合并密钥

返回0表示元素相等。如果你不返回0,元素永远不会相等。您的TreeMap使用了给定的Comparatorputremove。您的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的字符串键将被视为不同。