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