首頁  >  文章  >  Java  >  關於Java中對Map的排序問題實例詳解

關於Java中對Map的排序問題實例詳解

怪我咯
怪我咯原創
2017-07-02 10:38:021371瀏覽

本文給大家分享的是java中的map的按值排序和按鍵排序問題,並透過具體的範例,希望對大家能有所幫助。

Map的種類

在Java中,Map的主要功能是儲存鍵值對。由於是根據鍵得到值,所以不允許鍵重複。它主要有以下幾個類別:

HashMap:

#最常用的Map,它根據鍵的HashCode值儲存資料,根據鍵可以直接取得它的值,具有很快的存取速度,遍歷時,取得資料的順序是完全隨機的。 HashMap最多只允許一筆記錄的鍵為Null;允許多筆記錄的值為Null;HashMap不支援執行緒的同步,即任一時刻可以有多個執行緒同時寫HashMap;可能會導致資料的不一致。如果需要同步,可以用Collections的synchronizedMap方法讓HashMap具有同步的能力,或是使用ConcurrentHashMap。 Hashtable與HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或值為空;它支援線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtable在寫入時會比較慢。

LinkedHashMap

儲存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。也可以在構造時用帶參數,依照應用次數排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際資料較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際資料有關,和容量無關,而HashMap的遍歷速度和他的容量有關。

TreeMap

實作SortMap介面,能夠把它儲存的記錄依照鍵排序,預設是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。

按鍵排序

從上面Map的種類介紹我們可以看出,TreeMap是自帶按鍵排序的功能的,只需要在創建的時候同時實作一個Compare的介面就可以了,範例如下:

private static void sort_by_key(){
    Map<Integer, Integer> treeMap = new TreeMap<>(new Comparator<Integer>() {
      @Override
      public int compare(Integer o1, Integer o2) {
        return o2-o1; //倒序.这里说明一下,如果返回负值,则o1先输出,反之则o2
      }
    });
    
    //填充数据
    for(int i = 0; i < 100;i++){
      int key = (int)(10000*Math.random());
      int value = (int)(10000*Math.random());
      treeMap.put(key, value);
    }
    outMap(treeMap);
  }

public static void outMap(Map<Integer, Integer> map){
    for(Integer integer:map.keySet()){
      System.out.println("key="+integer+"  value="+map.get(integer));
    }
}
/* 结果如下:
key=9977  value=80
key=9684  value=7108
key=9422  value=1706
key=9264  value=1210
key=9248  value=4758
key=9024  value=7048
key=8892  value=3124
key=8879  value=6414
key=8814  value=8171
key=8728  value=1538
key=8513  value=4956
key=8462  value=5617
key=8355  value=8912
*/

從上面可以看出,按鍵排序是不難的,而安置排序就比較麻煩一些,需要將Map轉一下。

按值排序

由於Java中Map並沒有此功能,所以我們需要自己實作。想法如下:

Java中List是可以使用compare介面的。
Map其實就是Entrya8093152e673feb7aba1828c43532094的集合
那麼使用List就可以實現排序
將排好序的元素再插入到LinkedMap中

程式碼實作如下:

 private static Map<Integer, Integer> sortMap(Map<Integer, Integer> linkedMap) {
    
    List<Map.Entry<Integer, Integer>> cache = new ArrayList<>(linkedMap.entrySet());

    //重写比较函数
    Collections.sort(cache,new Comparator<Map.Entry<Integer, Integer>>() {
      @Override
      public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
        //若返回值小于0,则o1在o2前面
        return o2.getValue()-o1.getValue();
      }
    });

    Map<Integer, Integer> resultMap = new LinkedHashMap<>();
    //将结果插入LinkedMap然后返回
    for(int i = 0; i < cache.size();i++){
      resultMap.put(cache.get(i).getKey(), cache.get(i).getValue());
    }
    return resultMap;
  }
/*结果:
7965  9966
1067  9963
1720  9833
3257  9738
3934  9578
777  9348
1924  9315
3472  9270
3649  9114
5892  9078
*/

這樣,按值排序和按鍵排序就都可以實現了。

以上是關於Java中對Map的排序問題實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn