我试图通过执行这个循环来获得TreeMap的前10个元素:
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实现:
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。
发布于 2014-01-14 17:12:31
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()键,所以它将永远无法删除任何东西--无论您尝试搜索什么键,搜索映射都不会认为该键存在。
发布于 2014-01-14 16:55:18
编辑之后,您的自定义比较器显然是罪魁祸首。您真正想要实现的是收集地图中10个最高值的键。
但是,如果我可以说,你的做法是不必要的迂回。您已经有了一些map m,这是您的起点。因此,您需要的只是收集它的entrySet,按值对其进行排序,然后取前十个元素:
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还要高效。
发布于 2014-01-14 17:20:55
,我试过,就像跟着它对我起作用一样,
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());https://stackoverflow.com/questions/21119011
复制相似问题