我有一个问题,如标题写。我想知道为什么?
场景是,如果我有地图,则键表示id,值表示得分。
所以,首先,我想按分数对地图进行排序。其次,我希望在排序后获得前n个(可能是10个)元素。
我找到了实现我的想法的方法。但是我很困惑为什么地图不支持按值排序?
当我使用Java时,我将此代码编写为对HashMap
:
public class SortedMapTest {
public static void main(String[] args) {
Map<Long, Double> scoreMap = new HashMap<>();
scoreMap.put(100L, 3.0);
scoreMap.put(22L, 2.4);
scoreMap.put(45L, 2.0);
Map<Long, Double> sortedMap = new TreeMap<>(new ValueCompare(scoreMap));
sortedMap.putAll(scoreMap);
System.out.println(sortedMap);
}
static final class ValueCompare implements Comparator<Long> {
private Map<Long, Double> map;
public ValueCompare(Map<Long, Double> map) {
this.map = map;
}
@Override
public int compare(Long o1, Long o2) {
Double d1 = map.get(o1);
Double d2 = map.get(o2);
return d2.compareTo(d1);
}
}
}
答案 0 :(得分:2)
这不是Java的限制,而是您选择的特定地图实现的限制,即TreeMap
。此类的工作方式是条目的排序顺序不能仅因为条目的值更新而更改。
进一步注意,地图值通常不需要是不可变的,因此排序顺序实际上可以随时更改而不会让地图了解它。这就是为什么即使尝试实施这样的结构通常被认为是不好的设计。
还有其他选项可以满足您的原始要求,这些选项不涉及根据条目值自动排序的地图。最佳选择的选择将取决于您未发布的要求的详细信息。