TreeMap 删除不起作用

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

TreeMap 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实现:

  public static TreeMap sortMap(HashMap map) { ValueComparator bvc = new ValueComparator(map); TreeMap sorted_map = new TreeMap(bvc); sorted_map.putAll(map); return sorted_map; } class ValueComparator implements Comparator { java.util.Map base; public ValueComparator(java.util.Map 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按值排序 。

 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()的键remove()它永远无法删除任何东西 - 无论你尝试什么键,搜索地图都不会认为键存在。

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

但是,如果我可以说,你的方法是不必要的迂回。 你已经有了一些地图m ,这是你的出发点。 所以你需要的只是收集它的entrySet ,按值排序,并采取前十个元素:

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

请注意,一次性排序比将元素逐个插入二叉搜索树更有效。

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

我试着跟着它为我工作

  TreeMap 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());