为什么Java不支持按值排序?

Why Java do not support sorted by value?

我有个标题写的问题。我想知道为什么?

场景是,如果我有一张地图,key就是id,value就是score。

所以,首先,我想按分数对地图进行排序。其次,我想在排序后获得前 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);
        }
    }
}

这不是 Java 的限制,而是您选择的特定地图实现的限制,即 TreeMap。 class 的工作方式是条目的排序顺序不能仅仅因为条目的值被更新而改变。

进一步注意,地图值通常不需要是不可变的,因此排序顺序实际上可以随时更改,而地图不会知道它。这就是为什么即使尝试实现这样的结构也通常被认为是糟糕的设计。

还有其他选项可以满足您的原始要求,这些选项不涉及自动按条目值排序的地图。最佳选项的选择将取决于您没有 post.

的要求的详细信息