Java中Map的排序問題詳解
Map的種類
在Java中,Map的主要作用是存儲鍵值對。由于是根據(jù)鍵得到值,所以不允許鍵重復。它主要有如下幾個類別:
HashMap:
最常用的Map,它根據(jù)鍵的HashCode值存儲數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數(shù)據(jù)的順序是完全隨機的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數(shù)據(jù)的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable與HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。
LinkedHashMap
保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶參數(shù),按照應用次數(shù)排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數(shù)據(jù)較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數(shù)據(jù)有關,和容量無關,而HashMap的遍歷速度和他的容量有關。
TreeMap
實現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。
按鍵排序
從上面Map的種類介紹我們可以看出,TreeMap是自帶按鍵排序的功能的,只需要在創(chuàng)建的時候同時實現(xiàn)一個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 } }); //填充數(shù)據(jù) 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并沒有此功能,所以我們需要自己實現(xiàn)。思路如下:
Java中List是可以使用compare接口的。
Map實際上就是Entry<>的集合
那么使用List<Entry<>>就可以實現(xiàn)排序
將排好序的元素再插入到LinkedMap中
代碼實現(xiàn)如下:
private static Map<Integer, Integer> sortMap(Map<Integer, Integer> linkedMap) { List<Map.Entry<Integer, Integer>> cache = new ArrayList<>(linkedMap.entrySet()); //重寫比較函數(shù) 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 */
這樣,按值排序和按鍵排序就都可以實現(xiàn)了。
- java8 stream 操作map根據(jù)key或者value排序的實現(xiàn)
- java如何對map進行排序詳解(map集合的使用)
- Java Map 按照Value排序的實現(xiàn)方法
- Java Map 按key排序和按Value排序的實現(xiàn)方法
- 淺談Java之Map 按值排序 (Map sort by value)
- Java Map 按Key排序實例代碼
- Java中對list map根據(jù)map某個key值進行排序的方法
- Java使用LinkedHashMap進行分數(shù)排序
- Java TreeMap排序算法實例
- 如何利用Java8 Stream API對Map按鍵或值排序
相關文章
Spring集成Druid連接池及監(jiān)控配置的全過程
java程序很大一部分要操作數(shù)據(jù)庫,為了提高性能操作數(shù)據(jù)庫的時候,有不得不使用數(shù)據(jù)庫連接池,下面這篇文章主要給大家介紹了關于Spring集成Druid連接池及監(jiān)控配置的相關資料,需要的朋友可以參考下2021-09-09spring boot整合redis主從sentinel方式
這篇文章主要介紹了spring boot整合redis主從sentinel方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03類添加注解@RequestMapping報錯HTTP Status 404的解決
這篇文章主要介紹了類添加注解@RequestMapping報錯HTTP Status 404的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08