摘要:的種類(lèi)在中,的主要作用是存儲(chǔ)鍵值對(duì)。保存了記錄的插入順序,在用遍歷時(shí),先得到的記錄肯定是先插入的也可以在構(gòu)造時(shí)用帶參數(shù),按照應(yīng)用次數(shù)排序。按值排序由于中并沒(méi)有此功能,所以我們需要自己實(shí)現(xiàn)。思路如下中是可以使用接口的。
Map的種類(lèi)
在Java中,Map的主要作用是存儲(chǔ)鍵值對(duì)。由于是根據(jù)鍵得到值,所以不允許鍵重復(fù)。它主要有如下幾個(gè)類(lèi)別:
HashMap:
最常用的Map,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問(wèn)速度,遍歷時(shí),取得數(shù)據(jù)的順序是完全隨機(jī)的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫(xiě)HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable與HashMap類(lèi)似,它繼承自Dictionary類(lèi),不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫(xiě)Hashtable,因此也導(dǎo)致了 Hashtable在寫(xiě)入時(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的種類(lèi)介紹我們可以看出,TreeMap是自帶按鍵排序的功能的,只需要在創(chuàng)建的時(shí)候同時(shí)實(shí)現(xiàn)一個(gè)Compare的接口就可以了,例子如下:
private static void sort_by_key(){ MaptreeMap = new TreeMap<>(new Comparator () { @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 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
將排好序的元素再插入到LinkedMap中
代碼實(shí)現(xiàn)如下:
private static MapsortMap(Map linkedMap) { List > cache = new ArrayList<>(linkedMap.entrySet()); //重寫(xiě)比較函數(shù) Collections.sort(cache,new Comparator >() { @Override public int compare(Entry o1, Entry o2) { //若返回值小于0,則o1在o2前面 return o2.getValue()-o1.getValue(); } }); Map 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)了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65410.html
摘要:第三階段常見(jiàn)對(duì)象的學(xué)習(xí)集合框架集合在實(shí)際需求中,我們常常會(huì)遇到這樣的問(wèn)題,在諸多的數(shù)據(jù)中,通過(guò)其編號(hào)來(lái)尋找某一些信息,從而進(jìn)行查看或者修改,例如通過(guò)學(xué)號(hào)查詢(xún)學(xué)生信息。面試題和的區(qū)別是單列集合的頂層接口,有子接口和。 第三階段 JAVA常見(jiàn)對(duì)象的學(xué)習(xí) 集合框架——Map集合 showImg(https://segmentfault.com/img/remote/1460000019683...
集合接口 核心集合接口封裝了不同類(lèi)型的集合,如下圖所示,這些接口允許獨(dú)立于其表示的細(xì)節(jié)來(lái)操縱集合,核心集合接口是Java集合框架的基礎(chǔ),如下圖所示,核心集合接口形成層次結(jié)構(gòu)。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一種特殊的Collection,SortedSet是一種特殊的Set,依此類(lèi)推,另請(qǐng)注意,層次結(jié)構(gòu)...
摘要:對(duì)利用排序讓按進(jìn)行排序?qū)崿F(xiàn)一個(gè)比較器類(lèi)從小到大排序輸出結(jié)果 package com.cute.test;import java.util.Comparator;import java.util.Map;import java.util.TreeMap;public class SortMapTest { public s...
摘要:集合類(lèi)類(lèi)型解釋的父類(lèi)集集合中的元素不按特定方式排序,并且沒(méi)有重復(fù)對(duì)象。他的有些實(shí)現(xiàn)類(lèi)能對(duì)集合中的鍵對(duì)象進(jìn)行排序。 集合類(lèi) 2017-07-10 22:24:57 blog site https://github.com/Fiz1994 類(lèi)型解釋?zhuān)?Collection : Set,List 的父類(lèi) Set(集):集合中的元素不按特定方式排序,并且沒(méi)有重復(fù)對(duì)象。他的有些實(shí)現(xiàn)類(lèi)能對(duì)集合中的...
摘要:在最近寫(xiě)程序題的時(shí)候,需要存儲(chǔ)一個(gè)為為的后來(lái)需要根據(jù)的長(zhǎng)度對(duì)從小到大進(jìn)行排序。用代替,然后中的元素為配對(duì)類(lèi),變相實(shí)現(xiàn)了一個(gè)鍵對(duì)應(yīng)一個(gè)值的集合,并且能夠排序。 在最近寫(xiě)程序題的時(shí)候,需要存儲(chǔ)一個(gè)key為char,value為string的map,后來(lái)需要根據(jù)string的長(zhǎng)度對(duì)map從小到大進(jìn)行排序。 showImg(https://segmentfault.com/img/bVbiZz...
閱讀 2629·2021-11-18 10:02
閱讀 2286·2021-09-30 09:47
閱讀 1799·2021-09-27 14:01
閱讀 3116·2021-08-16 11:00
閱讀 3169·2019-08-30 11:06
閱讀 2400·2019-08-29 17:29
閱讀 1541·2019-08-29 13:19
閱讀 451·2019-08-26 13:54