2017-09-14 69 views
1

編輯裏面的值:解決。我需要定義的順序切換爲整數,動作排序一個TreeMap的java

我已經創建了一個一到一個TreeMap中,其中鍵是枚舉和的值是整數。我想循環從最小值到最大值,並且遇到一些麻煩。

功能當我運行下面的for循環不按升序排列打印值它創建地圖

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; 
} 

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

,因爲你的關鍵是 「行動」,而不是數量 – IddoE

+0

如果我可以這樣說,我認爲你正在嘗試使用一個數據結構來實現它沒有爲之而作。爲了給出一個建議,你可以對'directions'數組進行排序,並使TreeMap指向數組中的位置。這樣,您就擁有了兩全其美的優勢:您可以使用TreeMap快速獲取使用鍵搜索的值,並且只需使用排序的數組即可按順序打印所有值。 – Discoverer98

+0

好的。直覺上似乎倒退到我,因爲密鑰通常字符串和值是數字 –

回答

1

我猜Action是Enum,Enum已經實現了Comparable。

它採用枚舉常量的定義的順序,但可悲的是,你不能覆蓋的compareTo的方法來實現,因爲它被定義爲最後的字典序。

但是你可以通過自定義的比較,以樹形圖。

或者切換地圖<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