gpt4 book ai didi

java - 对 TreeMap java 中的值进行排序

转载 作者:行者123 更新时间:2023-11-30 06:30:36 26 4
gpt4 key购买 nike

编辑:已解决。我需要将定义的顺序切换为 Integer,Action

我创建了一个一对一的 TreeMap,其中键是枚举,值是整数。我想从最小到最大循环遍历这些值,但遇到了一些麻烦。

创建 map 的函数

public TreeMap<Action,Integer> mapMoves(int position, ArrayList<Action> directions){
TreeMap<Action,Integer> map = new TreeMap<>();
for(Action a : directions){
switch(a){
case UP:
map.put(a,board.get(position-3));
break;
case DOWN:
map.put(a,board.get(position+3));
break;
case LEFT:
map.put(a,board.get(position-1));
break;
case RIGHT:
map.put(a,board.get(position+1));
break;
}
}
return map;
}

当我运行以下 for 循环时,它不会按升序打印值。

TreeMap<Action, Integer> map = current.hashMoves(emptyIndex, possibleMoves);
for (Map.Entry<Action, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}

最佳答案

我猜测 Action 是 Enum,Enum 已经实现了 Comparable。

它使用枚举常量定义的顺序,但遗憾的是您无法重写compareTo方法来实现字典顺序,因为它被定义为final。

但是您可以将自定义比较器传递给 TreeMap。

将 map 切换到 <Integer,Action>或使用按值排序

static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = (k1, k2) -> {
int compare = map.get(k2).compareTo(map.get(k1));
if (compare == 0) return 1;
else return compare;
};
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
static TreeMap<Action,Integer> mapMoves() {
List<Action> directions = new ArrayList<>();
directions.add(Action.DOWN);
directions.add(Action.UP);
directions.add(Action.UP);
directions.add(Action.UP);
directions.add(Action.LEFT);
directions.add(Action.LEFT);
directions.add(Action.RIGHT);
directions.add(Action.RIGHT);
TreeMap<Action,Integer> map = new TreeMap<>();
for(Action a : directions){
switch (a){
case UP:
map.put(a, 10);
break;
case DOWN:
map.put(a, 2);
break;
case LEFT:
map.put(a, 30);
break;
case RIGHT:
map.put(a, 4);
break;
}
}
return map;
}

enum Action {
UP, DOWN, LEFT, RIGHT
}

主要内容

    TreeMap<Action, Integer> map = mapMoves();
map.entrySet().stream().forEach(e -> System.out.println("e = " + e.getKey() + ": " + e.getValue()));
System.out.println("- - -");
Map<Action, Integer> sortedMapByValuesDescOrder = sortByValues(map);
sortedMapByValuesDescOrder.entrySet().stream().forEach(e -> System.out.println("e = " + e.getKey() + ": " + e.getValue()));

输出将是

e = UP: 10
e = DOWN: 2
e = LEFT: 30
e = RIGHT: 4
- - -
e = LEFT: 30
e = UP: 10
e = RIGHT: 4
e = DOWN: 2

关于java - 对 TreeMap java 中的值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46229051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com