为什么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.
的要求的详细信息
我有个标题写的问题。我想知道为什么?
场景是,如果我有一张地图,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.
的要求的详细信息