Java中Map的排序問(wèn)題詳解
Map的種類
在Java中,Map的主要作用是存儲(chǔ)鍵值對(duì)。由于是根據(jù)鍵得到值,所以不允許鍵重復(fù)。它主要有如下幾個(gè)類別:
HashMap:
最常用的Map,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問(wèn)速度,遍歷時(shí),取得數(shù)據(jù)的順序是完全隨機(jī)的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable與HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫Hashtable,因此也導(dǎo)致了 Hashtable在寫入時(shí)會(huì)比較慢。
LinkedHashMap
保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時(shí),先得到的記錄肯定是先插入的.也可以在構(gòu)造時(shí)用帶參數(shù),按照應(yīng)用次數(shù)排序。在遍歷的時(shí)候會(huì)比HashMap慢,不過(guò)有種情況例外,當(dāng)HashMap容量很大,實(shí)際數(shù)據(jù)較少時(shí),遍歷起來(lái)可能會(huì)比LinkedHashMap慢,因?yàn)長(zhǎng)inkedHashMap的遍歷速度只和實(shí)際數(shù)據(jù)有關(guān),和容量無(wú)關(guān),而HashMap的遍歷速度和他的容量有關(guān)。
TreeMap
實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過(guò)序的。
按鍵排序
從上面Map的種類介紹我們可以看出,TreeMap是自帶按鍵排序的功能的,只需要在創(chuàng)建的時(shí)候同時(shí)實(shí)現(xiàn)一個(gè)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; //倒序.這里說(shuō)明一下,如果返回負(fù)值,則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));
}
}
/* 結(jié)果如下:
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轉(zhuǎn)一下。
按值排序
由于Java中Map并沒(méi)有此功能,所以我們需要自己實(shí)現(xiàn)。思路如下:
Java中List是可以使用compare接口的。
Map實(shí)際上就是Entry<>的集合
那么使用List<Entry<>>就可以實(shí)現(xiàn)排序
將排好序的元素再插入到LinkedMap中
代碼實(shí)現(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<>();
//將結(jié)果插入LinkedMap然后返回
for(int i = 0; i < cache.size();i++){
resultMap.put(cache.get(i).getKey(), cache.get(i).getValue());
}
return resultMap;
}
/*結(jié)果:
7965 9966
1067 9963
1720 9833
3257 9738
3934 9578
777 9348
1924 9315
3472 9270
3649 9114
5892 9078
*/
這樣,按值排序和按鍵排序就都可以實(shí)現(xiàn)了。
- java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn)
- java如何對(duì)map進(jìn)行排序詳解(map集合的使用)
- Java Map 按照Value排序的實(shí)現(xiàn)方法
- Java Map 按key排序和按Value排序的實(shí)現(xiàn)方法
- 淺談Java之Map 按值排序 (Map sort by value)
- Java Map 按Key排序?qū)嵗a
- Java中對(duì)list map根據(jù)map某個(gè)key值進(jìn)行排序的方法
- Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序
- Java TreeMap排序算法實(shí)例
- 如何利用Java8 Stream API對(duì)Map按鍵或值排序
相關(guān)文章
mybatis-plus中wrapper的用法實(shí)例詳解
本文給大家介紹了mybatis-plus中wrapper的用法,包括條件構(gòu)造器關(guān)系、項(xiàng)目實(shí)例及具體使用操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
spring cloud整合ribbon問(wèn)題及解決方案
很多小伙伴在整合ribbon都出了相同的問(wèn)題,今天特地為大家整理了該問(wèn)題的解決方案,文中有非常詳細(xì)的圖文解說(shuō),對(duì)出現(xiàn)同樣問(wèn)題的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
SpringBoot中Bean拷貝及工具類封裝的實(shí)現(xiàn)
本文主要介紹了SpringBoot中Bean拷貝及工具類封裝的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下
這篇文章主要為大家介紹了java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
MyBatis的CRUD中的不同參數(shù)綁定查詢實(shí)現(xiàn)
本文主要介紹了MyBatis的CRUD中的不同參數(shù)綁定查詢實(shí)現(xiàn),主要包括單個(gè)參數(shù)傳遞綁定,序號(hào)參數(shù)傳遞綁定,注解參數(shù)傳遞綁定,pojo(對(duì)象)參數(shù)傳遞綁定,map參數(shù)傳遞綁定這幾種類型,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Springboot hibernate envers使用過(guò)程詳解
這篇文章主要介紹了Springboot hibernate envers使用過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
一文搞懂接口參數(shù)簽名與驗(yàn)簽(附含java python php版)
這篇文章主要為大家介紹了java python php不同版的接口參數(shù)簽名與驗(yàn)簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

