首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TreeMap<Integer,Integer>删除不工作

TreeMap<Integer,Integer>删除不工作
EN

Stack Overflow用户
提问于 2014-01-14 16:45:27
回答 3查看 1.2K关注 0票数 2

我试图通过执行这个循环来获得TreeMap的前10个元素:

代码语言:javascript
复制
        TreeMap<Integer, Integer> sortedMap = sortMap(m);
        String outString = "";
        int count = 10;
        while (count > 0) {
            count--;
            Integer k = sortedMap.firstKey();
            outString += String.valueOf(k);
            sortedMap.remove(k);
            if (count != 0) {
                outString += ",";
            }
        }

        System.out.println("outVal is " + outVal);

这会打印outVal is 11377,11377,11377,11377,11377,11377,11377,11377,11377,11377 Integer实现Comparable,那么为什么remove不能工作呢?

更新这里是我的sortMap实现:

代码语言:javascript
复制
        public static TreeMap<Integer, Integer> sortMap(HashMap<Integer, Integer> map) {
           ValueComparator bvc =  new ValueComparator(map);
           TreeMap<Integer,Integer> sorted_map = new TreeMap<Integer,Integer>(bvc);
           sorted_map.putAll(map);
           return sorted_map;
        }

class ValueComparator implements Comparator<Integer> {
    java.util.Map<Integer, Integer> base;
    public ValueComparator(java.util.Map<Integer, Integer> base) {
        this.base = base;
    }

    // Note: this comparator imposes orderings that are inconsistent with equals.    
    public int compare(Integer a, Integer b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}

更新这是很有帮助的:Java Map sort by value

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-14 17:12:31

代码语言:javascript
复制
public int compare(Integer a, Integer b) {
    if (base.get(a) >= base.get(b)) {
        return -1;
    } else {
        return 1;
    } // returning 0 would merge keys
}

这个比较器有缺陷,因为(除了它与equals不一致之外),它不满足比较器契约,即compare(a,b) > 0意味着compare(b,a) < 0,反之亦然。而且,由于TreeMap依赖于返回0的比较器来查找您要尝试的remove()键,所以它将永远无法删除任何东西--无论您尝试搜索什么键,搜索映射都不会认为该键存在。

票数 6
EN

Stack Overflow用户

发布于 2014-01-14 16:55:18

编辑之后,您的自定义比较器显然是罪魁祸首。您真正想要实现的是收集地图中10个最高值的键。

但是,如果我可以说,你的做法是不必要的迂回。您已经有了一些map m,这是您的起点。因此,您需要的只是收集它的entrySet,按值对其进行排序,然后取前十个元素:

代码语言:javascript
复制
import java.util.Map.Entry;

final List<Entry<Integer,Integer>> list = new ArrayList<>(m.entrySet());
Collections.sort(list, new Comparator<Entry<Integer, Integer>>() {
  @Override public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
    return o1.getValue().compareTo(o2.getValue());
  }});
final StringBuilder b = new StringBuilder();
String delimiter = "";
for (Entry<Integer, Integer> e : list.subList(0, 10)) {
  b.append(delimiter).append(e.getKey());
  delimiter = ",";
}
System.out.println(b);

请注意,一次排序比一个接一个地将元素插入二进制搜索树的效率更高。

我也在使用StringBuilder,它比在每一步中重新创建一个完整的String还要高效。

票数 4
EN

Stack Overflow用户

发布于 2014-01-14 17:20:55

,我试过,就像跟着它对我起作用一样,

代码语言:javascript
复制
    TreeMap<Integer, Integer> sortedMap = new TreeMap<>();
    String outString = "";
    sortedMap.put(1, 10);
    sortedMap.put(2, 20);
    sortedMap.put(3, 30);
    sortedMap.put(4, 40);
    sortedMap.put(5, 50);
    int count = 5;
    while (count > 0) {
        count--;
        Integer k = sortedMap.firstKey();
        outString += sortedMap.get(k);//String.valueOf(k);
        sortedMap.remove(k);
        if (count != 0) {
            outString += ",";
        }
    }

    System.out.println("outVal is " + outString);
    System.out.println(sortedMap.size());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21119011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档