list中含有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轉一下。

按值排序

package cn.uicps.sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Sort {
    /**
     * list中含有map根據map的value排序
     * @param args
     */

    public static void main(String[] args) {
         List<Map<Object, Object>> list = new ArrayList<Map<Object, Object>>();        
            Map<Object, Object> map = new HashMap<Object, Object>();
            Map<Object, Object> map1 = new HashMap<Object, Object>();
            Map<Object, Object> map2 = new HashMap<Object, Object>();
            Map<Object, Object> map3 = new HashMap<Object, Object>();
    
            map.put("number", 1);
            map1.put("number", 2);
            map2.put("number", 4);
            map3.put("number", 3);
            list.add(map);
            list.add(map1);
            list.add(map2);
            list.add(map3);
            System.out.println("排序前"+list);
            Collections.sort(list, new Comparator<Map<Object, Object>>() {    
                public int compare(Map<Object, Object> o1, Map<Object, Object> o2) {
                    int map1value = (Integer) o1.get("number");
                    int map2value = (Integer) o2.get("number");    
                    /**
                     * 只有在value的值是int是用下面寫法
                     * 如果value是其他類型的用compareTo比較
                     */
                    return map1value - map2value;
                    //return String.valueOf(map1value).compareTo(String.valueOf(map2value));
                }
            });
            System.out.println("排序后"+list);
    }

}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM