摘要:在最近寫程序題的時(shí)候,需要存儲(chǔ)一個(gè)為為的后來需要根據(jù)的長度對(duì)從小到大進(jìn)行排序。用代替,然后中的元素為配對(duì)類,變相實(shí)現(xiàn)了一個(gè)鍵對(duì)應(yīng)一個(gè)值的集合,并且能夠排序。
在最近寫程序題的時(shí)候,需要存儲(chǔ)一個(gè)key為char,value為string的map,后來需要根據(jù)string的長度對(duì)map從小到大進(jìn)行排序。
目標(biāo):
1.用Pair配對(duì)一開始用的是HashMap,但是后面發(fā)現(xiàn)HashMap是無序的,于是想把HashMap的一個(gè)鍵值對(duì)取出來,存到集合里,再對(duì)集合進(jìn)行自定義排序,上網(wǎng)搜到有一個(gè)配對(duì)的類Pair,他有一個(gè)key和一個(gè)value屬性,想到用來代替HashMap的一個(gè)鍵值對(duì)。
用ArrayList代替HashMap,然后ArrayList中的元素為配對(duì)類,變相實(shí)現(xiàn)了一個(gè)鍵對(duì)應(yīng)一個(gè)值的集合,并且能夠排序。
首先存儲(chǔ)配對(duì)到集合中:ArrayList對(duì)集合進(jìn)行排序> pairs = new ArrayList<>(); Pair pair; pair = new Pair<>(1, "abc"); pairs.add(pair); pair = new Pair<>(2, "abcd"); pairs.add(pair); pair = new Pair<>(3, "ab"); pairs.add(pair); pair = new Pair<>(4, "abcde"); pairs.add(pair);
調(diào)用ArrayList對(duì)象的sort方法進(jìn)行排序,他需要Comparator接口,有三種實(shí)現(xiàn)方法:
內(nèi)部類進(jìn)行排序public class Main { public static void main(String[] args) { ArrayList匿名內(nèi)部類進(jìn)行排序> pairs = new ArrayList<>(); Pair pair; pair = new Pair<>(1, "abc"); pairs.add(pair); pair = new Pair<>(2, "abcd"); pairs.add(pair); pair = new Pair<>(3, "ab"); pairs.add(pair); pair = new Pair<>(4, "abcde"); pairs.add(pair); pairs.sort(new Main().new StringCmp());//建立Main內(nèi)部類的一個(gè)實(shí)例對(duì)象 } //實(shí)現(xiàn)比較接口的內(nèi)部類 public class StringCmp implements Comparator{ @Override public int compare(Object o1, Object o2) { Pair s1 = (Pair)o1; Pair s2 = (Pair)o2; return new Integer(s1.getValue().length()).compareTo(s2.getValue().length()); } } }
如果不需要復(fù)用這個(gè)排序的方法,多帶帶為他寫一個(gè)類太過浪費(fèi)又不安全,可以使用匿名的內(nèi)部類
public class Main { public static void main(String[] args) { ArrayList> pairs = new ArrayList<>(); Pair pair; pair = new Pair<>(1, "abc"); pairs.add(pair); pair = new Pair<>(2, "abcd"); pairs.add(pair); pair = new Pair<>(3, "ab"); pairs.add(pair); pair = new Pair<>(4, "abcde"); pairs.add(pair); //使用匿名內(nèi)部類 pairs.sort(new Comparator() { @Override public int compare(Object o1, Object o2) { Pair s1 = (Pair)o1; Pair s2 = (Pair)o2; return new Integer(s1.getValue().length()).compareTo(s2.getValue().length()); } }); } }
判斷的代碼雷同,只是不用在去新建一個(gè)類。
lambda表達(dá)式lambda表達(dá)式就是匿名內(nèi)部類的簡寫版:
import javafx.util.Pair; import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList2.用TreeMap進(jìn)行排序> pairs = new ArrayList<>(); Pair pair; pair = new Pair<>(1, "abc"); pairs.add(pair); pair = new Pair<>(2, "abcd"); pairs.add(pair); pair = new Pair<>(3, "ab"); pairs.add(pair); pair = new Pair<>(4, "abcde"); pairs.add(pair); pairs.sort((pair1, pair2)->{return new Integer(pair1.getValue().length()).compareTo(new Integer(pair2.getValue().length()));}); } }
用配對(duì)進(jìn)行存儲(chǔ)初步解決了目的,但是這樣存儲(chǔ)的就不是Map而是ArrayList的了,也就不能使用Map的方法,雖然解決了需求,但是感覺方向錯(cuò)了,去網(wǎng)上一搜,返現(xiàn)Map有能夠排序的實(shí)現(xiàn)類TreeMap,他僅需創(chuàng)建時(shí)傳入Comparator的接口實(shí)現(xiàn)類,就能夠?qū)崿F(xiàn)存儲(chǔ)是排序了:
public class Main { public static void main(String[] args) { TreeMaptreeMap = new TreeMap ((s1, s2)->{ return new Integer(s1.length()).compareTo(new Integer(s2.length())); }); treeMap.put("abc", 1); treeMap.put("abcd", 2); treeMap.put("ab", 3); treeMap.put("abcde", 4); } }
代碼簡短,通俗易懂,但是因?yàn)門reeMap只能按照key進(jìn)行排序,而我的要求是根據(jù)value的長度進(jìn)行排序,所有在這里我把key和value的類型互換了,但這樣之前可以通過int類型的編號(hào)找到string類型值,在更改之后,就不能通過標(biāo)號(hào)找到值了.雖然有好處良多,但是不符合我的情況.
3.HashMap轉(zhuǎn)成list再排序HashMap的對(duì)象有一個(gè)方法,他可以把所有的鍵值對(duì)集合轉(zhuǎn)換為一個(gè)set集合,集合元素是Map.Entry,可以把HashMap轉(zhuǎn)換為Set之后再轉(zhuǎn)換成ArrayList再調(diào)用sort方法進(jìn)行排序,達(dá)到根據(jù)value進(jìn)行排序的效果:
public class Main { public static void main(String[] args) { HashMaphashMap = new HashMap<>(); hashMap.put(1, "aec"); hashMap.put(2, "abcd"); hashMap.put(3, "ab"); hashMap.put(4, "abcde"); ArrayList > arrayList = new ArrayList<>(hashMap.entrySet()); arrayList.sort((entry1, entry2)->{ return new Integer(entry1.getValue().length()).compareTo(new Integer(entry2.getValue().length())); }); } }
感覺這是第一種方法,加上一個(gè)HashMap得到的結(jié)果,這樣可以從按照value進(jìn)行排序(排序結(jié)果保存在arrayList中),也可以從key找到value(在HashMap中),但是存儲(chǔ)內(nèi)存卻浪費(fèi)了,多了一個(gè)list,不知道有沒有直接根據(jù)value直接排序的map.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/71996.html
摘要:的種類在中,的主要作用是存儲(chǔ)鍵值對(duì)。保存了記錄的插入順序,在用遍歷時(shí),先得到的記錄肯定是先插入的也可以在構(gòu)造時(shí)用帶參數(shù),按照應(yīng)用次數(shù)排序。按值排序由于中并沒有此功能,所以我們需要自己實(shí)現(xiàn)。思路如下中是可以使用接口的。 Map的種類 在Java中,Map的主要作用是存儲(chǔ)鍵值對(duì)。由于是根據(jù)鍵得到值,所以不允許鍵重復(fù)。它主要有如下幾個(gè)類別: HashMap: 最常用的Map,它根據(jù)鍵的Ha...
摘要:看例子,學(xué)二看例子,學(xué)一看例子,學(xué)三模塊文件定義了函數(shù)和,就是一個(gè)模塊。這個(gè)列表里的每個(gè)元素都是一個(gè)鍵值對(duì),由元組表示。指定的為,便以每個(gè)鍵值對(duì)元組下標(biāo)為的元素進(jìn)行排序。可將其它序列類型轉(zhuǎn)換成元組看例子,學(xué)一看例子,學(xué)三 看例子,學(xué) Python(二) 看例子,學(xué) Python(一)看例子,學(xué) Python(三) 模塊 文件 mymath.py 定義了函數(shù) fib 和 fac,myma...
摘要:分別獲取正序反序的鍵集。是用來實(shí)現(xiàn)機(jī)制的第部分源碼解析基于為了更了解的原理,下面對(duì)源碼代碼作出分析。實(shí)現(xiàn)了迭代器和枚舉兩個(gè)接口獲取的迭代器若的實(shí)際大小為則返回空迭代器對(duì)象否則,返回正常的的對(duì)象。 概要 前面,我們已經(jīng)系統(tǒng)的對(duì)List進(jìn)行了學(xué)習(xí)。接下來,我們先學(xué)習(xí)Map,然后再學(xué)習(xí)Set;因?yàn)镾et的實(shí)現(xiàn)類都是基于Map來實(shí)現(xiàn)的(如,HashSet是通過HashMap實(shí)現(xiàn)的,TreeSe...
摘要:第三階段常見對(duì)象的學(xué)習(xí)集合框架集合在實(shí)際需求中,我們常常會(huì)遇到這樣的問題,在諸多的數(shù)據(jù)中,通過其編號(hào)來尋找某一些信息,從而進(jìn)行查看或者修改,例如通過學(xué)號(hào)查詢學(xué)生信息。面試題和的區(qū)別是單列集合的頂層接口,有子接口和。 第三階段 JAVA常見對(duì)象的學(xué)習(xí) 集合框架——Map集合 showImg(https://segmentfault.com/img/remote/1460000019683...
閱讀 1864·2021-09-22 15:45
閱讀 1649·2019-08-30 15:55
閱讀 1834·2019-08-29 11:16
閱讀 3308·2019-08-26 11:44
閱讀 711·2019-08-23 17:58
閱讀 2701·2019-08-23 12:25
閱讀 1633·2019-08-22 17:15
閱讀 3611·2019-08-22 16:09