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

时间:2015-01-12 15:00:52

标签: java data-structures

我有一个问题,如标题写。我想知道为什么?

场景是,如果我有地图,则键表示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);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

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

还有其他选项可以满足您的原始要求,这些选项不涉及根据条目值自动排序的地图。最佳选择的选择将取决于您未发布的要求的详细信息。