2016-11-29 53 views
0

我有此代碼來填充HashMap並將它傳遞到TreeMapKey值自然排序它。使用HashMap並使用具有遞減鍵值的TreeMap進行排序

Map<Integer, String[]> hashMap = new HashMap<Integer, String[]>(); 
    hashMap.put(3, new String[]{"1","2"}); 
    hashMap.put(2, new String[]{"1","2"}); 
    hashMap.put(4, new String[]{"1","2"}); 
    hashMap.put(1, new String[]{"1","2"}); 

    System.out.println(hashMap); 

    Map<Integer, String[]> treeMap = new TreeMap<Integer, String[]>(hashMap); 

    System.out.println(hashMap); // Natural Order, Ascending 

現在我的問題是,如何將我的treeMapDescending順序排序?我準備了名爲KeyComparator的比較器類,按Key的降序排列。這裏是我下面的代碼:

public class KeyComparator implements Comparator<Integer> { 
    @Override 
    public int compare(Integer o1, Integer o2) { 
     if (o1 < o2) { 
      return 1; 
     } else if (o1 > o2) { 
      return -1; 
     } else { 
      return 0; 
     } 
    } 
} 

TreeMap沒有2參數的構造函數例如像TreeMap(new KeyComparator(),hashMap)。如何在同一時間使用我的KeyComparator課程將hashMap加載到我的treeMap中。

+1

如果你需要的是下降的自然順序,那麼你可以使用'新的TreeMap (hashMap).descendingMap()' –

回答

2

像下面這樣做,使用Comparator創建一個樹形圖,然後使用putAll方法將hashmap傳遞給它。

Map<Integer, String[]> treeMap = new TreeMap<Integer, String[]>(new Comparator<Integer>() { 
    @Override 
    public int compare(Integer o1, Integer o2) { 
     if (o1 < o2) { 
      return 1; 
     } else if (o1 > o2) { 
      return -1; 
     } else { 
      return 0; 
     } 
    } 
}); 
treeMap.putAll(hashMap); 

System.out.println(treeMap); // Descending 

注: -在上面的例子中,我已經過了一個匿名實現Comparator。您始終可以在構造函數中傳遞KeyComparator

+0

''treeMap.putAll''確實有幫助。這是我第一次使用它。謝謝。 – msagala25

1

雖然這可能無法回答你的問題,爲什麼不簡單地使用數組來排序?已經提到

System.out.println("map: " + hashMap); 
List<Integer> keys = new ArrayList<Integer>(hashMap.keySet()); 
System.out.println("unsorted keys: " + keys); 
Collections.sort(keys); 
System.out.println("sorted (asc) keys: " + keys); 
Collections.reverse(keys); 
System.out.println("sorted (desc) keys: " + keys); 
+0

對不起,但我需要它以TreeMap的方式,順便說一句,謝謝你的幫助。 – msagala25

1

正如,你需要首先使用構造函數是TreeMap(Comparator<? super K> comparator)然後使用putAll(Map<? extends K,? extends V> m)添加的所有條目中的關鍵比較。

如果使用的Java 8沒有必要重新實現它,只需使用Comparator.reverseOrder()得到自然排序的反向作爲下一個:

Map<Integer, String[]> treeMap = new TreeMap<>(Comparator.reverseOrder()); 
treeMap.putAll(hashMap); 
System.out.println(treeMap); 
+1

我正在使用** Java 7 **。 'treeMap.putAll'是我所需要的,感謝通過** Java 8 **概述我的方式。 – msagala25

0

樹狀圖有這個一個不錯的方法。你可以做

TreeMap<Integer, String[]> map = new TreeMap<>(hashMap); 
NavigleMap<Integer, String[]> reversedMap = map.descendingMap(); 
相關問題