首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序TreeMap java中的值

排序TreeMap java中的值
EN

Stack Overflow用户
提问于 2017-09-14 22:21:14
回答 1查看 129关注 0票数 1

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

我已经创建了一个一对一的TreeMap,其中键是Enum,值是整数。我想从最少循环到最大,我遇到了一些麻烦。

函数,该函数创建映射

代码语言:javascript
复制
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循环时,它不会按升序打印值。

代码语言:javascript
复制
TreeMap<Action, Integer> map = current.hashMoves(emptyIndex, possibleMoves);
for (Map.Entry<Action, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-14 22:27:20

我猜Action是Enum,Enum已经实现了类似的。

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

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

将映射切换到<Integer,Action>或使用

代码语言:javascript
复制
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
}

main

代码语言:javascript
复制
    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()));

输出将

代码语言:javascript
复制
e = UP: 10
e = DOWN: 2
e = LEFT: 30
e = RIGHT: 4
- - -
e = LEFT: 30
e = UP: 10
e = RIGHT: 4
e = DOWN: 2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46229051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档