Java数据结构Map遍历和排序
map結構和list結合很好用,基本的遍歷和排序每次都要查一下,用的不熟練,這里匯總下map的基本遍歷和排序,參考的代碼如下:
package com.vip;import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random;public class MapSort {public static void main(String args[]){Random random = new Random();Map<String,Integer> indexScore=new HashMap<String,Integer>();for (int i = 0; i < 10; i++) indexScore.put(String.valueOf(i), random.nextInt(99));//遍歷mapSystem.out.println("排序前遍歷:");Iterator<String> iter = indexScore.keySet().iterator();while (iter.hasNext()) {String key = iter.next();int value = indexScore.get(key); System.out.println("key:"+key+","+"value:"+String.valueOf(value));}List<Map.Entry<String, Integer>> listIndexScore = new ArrayList<Map.Entry<String, Integer>>(indexScore.entrySet());//map按照value逆序排序Collections.sort(listIndexScore, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (int) (o2.getValue() - o1.getValue()); //return (o1.getKey()).toString().compareTo(o2.getKey());//按照key值排序}}); System.out.println("排序后遍歷:");Map<String,Integer> indexScoresort=new HashMap<String,Integer>();for (int i = 0; i < listIndexScore.size(); i++) {indexScoresort.put(listIndexScore.get(i).getKey(), listIndexScore.get(i).getValue());String id = listIndexScore.get(i).toString();System.out.println(id);}//這個地方不知道為什么不是按照map的順序輸出for (Entry<String, Integer> entry: indexScoresort.entrySet()) {String key = entry.getKey();int value = entry.getValue();System.out.println("key:"+key+","+"value:"+String.valueOf(value));}} }Java集合類架構層次關系:
1. Interface Iterable
迭代器接口,這是Collection類的父接口。實現這個Iterable接口的對象允許使用foreach進行遍歷,也就是說,所有的Collection集合對象都具有"foreach可遍歷性"。這個Iterable接口只
有一個方法: iterator()。它返回一個代表當前集合對象的泛型<T>迭代器,用于之后的遍歷操作
1.1 Collection
Collection是最基本的集合接口,一個Collection代表一組Object的集合,這些Object被稱作Collection的元素。Collection是一個接口,用以提供規范定義,不能被實例化使用
? ? 1) Set
? ? Set集合類似于一個罐子,"丟進"Set集合里的多個對象之間沒有明顯的順序。Set繼承自Collection接口,不能包含有重復元素(記住,這是整個Set類層次的共有屬性)。
? ? Set判斷兩個對象相同不是使用"=="運算符,而是根據equals方法。也就是說,我們在加入一個新元素的時候,如果這個新元素對象和Set中已有對象進行注意equals比較都返回false,
? 則Set就會接受這個新元素對象,否則拒絕。
? ? 因為Set的這個制約,在使用Set集合的時候,應該注意兩點:1) 為Set集合里的元素的實現類實現一個有效的equals(Object)方法、2) 對Set的構造函數,傳入的Collection參數不能包
含重復的元素
? ? ? ? 1.1) HashSet
? ? ? ? HashSet是Set接口的典型實現,HashSet使用HASH算法來存儲集合中的元素,因此具有良好的存取和查找性能。當向HashSet集合中存入一個元素時,HashSet會調用該對象的
hashCode()方法來得到該對象的hashCode值,然后根據該HashCode值決定該對象在HashSet中的存儲位置。
? ? ? ? 值得主要的是,HashSet集合判斷兩個元素相等的標準是兩個對象通過equals()方法比較相等,并且兩個對象的hashCode()方法的返回值相等
? ? ? ? ? ? 1.1.1) LinkedHashSet
? ? ? ? ? ? LinkedHashSet集合也是根據元素的hashCode值來決定元素的存儲位置,但和HashSet不同的是,它同時使用鏈表維護元素的次序,這樣使得元素看起來是以插入的順序保存的。
當遍歷LinkedHashSet集合里的元素時,LinkedHashSet將會按元素的添加順序來訪問集合里的元素。
? ? ? ? ? ? LinkedHashSet需要維護元素的插入順序,因此性能略低于HashSet的性能,但在迭代訪問Set里的全部元素時(遍歷)將有很好的性能(鏈表很適合進行遍歷)
? ? ? ? 1.2) SortedSet ? ?
? ? ? ? 此接口主要用于排序操作,即實現此接口的子類都屬于排序的子類
? ? ? ? ? ? 1.2.1) TreeSet
? ? ? ? ? ? TreeSet是SortedSet接口的實現類,TreeSet可以確保集合元素處于排序狀態
? ? ? ? 1.3) EnumSet
? ? ? ? EnumSet是一個專門為枚舉類設計的集合類,EnumSet中所有元素都必須是指定枚舉類型的枚舉值,該枚舉類型在創建EnumSet時顯式、或隱式地指定。EnumSet的集合元素也是有序的,
它們以枚舉值在Enum類內的定義順序來決定集合元素的順序
? ? 2) List
? ? List集合代表一個元素有序、可重復的集合,集合中每個元素都有其對應的順序索引。List集合允許加入重復元素,因為它可以通過索引來訪問指定位置的集合元素。List集合默認按元素
的添加順序設置元素的索引
? ? ? ? 2.1) ArrayList
? ? ? ? ArrayList是基于數組實現的List類,它封裝了一個動態的增長的、允許再分配的Object[]數組。
? ? ? ? 2.2) Vector
? ? ? ? Vector和ArrayList在用法上幾乎完全相同,但由于Vector是一個古老的集合,所以Vector提供了一些方法名很長的方法,但隨著JDK1.2以后,java提供了系統的集合框架,就將
Vector改為實現List接口,統一歸入集合框架體系中
? ? ? ? ? ? 2.2.1) Stack
? ? ? ? ? ? Stack是Vector提供的一個子類,用于模擬"棧"這種數據結構(LIFO后進先出)
? ? ? ? 2.3) LinkedList
? ? ? ? implements List<E>, Deque<E>。實現List接口,能對它進行隊列操作,即可以根據索引來隨機訪問集合中的元素。同時它還實現Deque接口,即能將LinkedList當作雙端隊列
使用。自然也可以被當作"棧來使用"
? ? 3) Queue
? ? Queue用于模擬"隊列"這種數據結構(先進先出 FIFO)。隊列的頭部保存著隊列中存放時間最長的元素,隊列的尾部保存著隊列中存放時間最短的元素。新元素插入(offer)到隊列的尾部,
訪問元素(poll)操作會返回隊列頭部的元素,隊列不允許隨機訪問隊列中的元素。結合生活中常見的排隊就會很好理解這個概念
? ? ? ? 3.1) PriorityQueue
? ? ? ? PriorityQueue并不是一個比較標準的隊列實現,PriorityQueue保存隊列元素的順序并不是按照加入隊列的順序,而是按照隊列元素的大小進行重新排序,這點從它的類名也可以
看出來
? ? ? ? 3.2) Deque
? ? ? ? Deque接口代表一個"雙端隊列",雙端隊列可以同時從兩端來添加、刪除元素,因此Deque的實現類既可以當成隊列使用、也可以當成棧使用
? ? ? ? ? ? 3.2.1) ArrayDeque
? ? ? ? ? ? 是一個基于數組的雙端隊列,和ArrayList類似,它們的底層都采用一個動態的、可重分配的Object[]數組來存儲集合元素,當集合元素超出該數組的容量時,系統會在底層重
新分配一個Object[]數組來存儲集合元素
? ? ? ? ? ? 3.2.2) LinkedList
1.2 Map
Map用于保存具有"映射關系"的數據,因此Map集合里保存著兩組值,一組值用于保存Map里的key,另外一組值用于保存Map里的value。key和value都可以是任何引用類型的數據。Map的key不允
許重復,即同一個Map對象的任何兩個key通過equals方法比較結果總是返回false。
關于Map,我們要從代碼復用的角度去理解,java是先實現了Map,然后通過包裝了一個所有value都為null的Map就實現了Set集合
Map的這些實現類和子接口中key集的存儲形式和Set集合完全相同(即key不能重復)
Map的這些實現類和子接口中value集的存儲形式和List非常類似(即value可以重復、根據索引來查找)
? ? 1) HashMap
? ? 和HashSet集合不能保證元素的順序一樣,HashMap也不能保證key-value對的順序。并且類似于HashSet判斷兩個key是否相等的標準也是: 兩個key通過equals()方法比較返回true、
同時兩個key的hashCode值也必須相等
? ? ? ? 1.1) LinkedHashMap
? ? ? ? LinkedHashMap也使用雙向鏈表來維護key-value對的次序,該鏈表負責維護Map的迭代順序,與key-value對的插入順序一致(注意和TreeMap對所有的key-value進行排序進行區
分)
? ? 2) Hashtable
? ? 是一個古老的Map實現類
? ? ? ? 2.1) Properties?
? ? ? ? Properties對象在處理屬性文件時特別方便(windows平臺上的.ini文件),Properties類可以把Map對象和屬性文件關聯起來,從而可以把Map對象中的key-value對寫入到屬性文
件中,也可以把屬性文件中的"屬性名-屬性值"加載到Map對象中
? ? 3) SortedMap
? ? 正如Set接口派生出SortedSet子接口,SortedSet接口有一個TreeSet實現類一樣,Map接口也派生出一個SortedMap子接口,SortedMap接口也有一個TreeMap實現類
? ? ? ? 3.1) TreeMap
? ? ? ? TreeMap就是一個紅黑樹數據結構,每個key-value對即作為紅黑樹的一個節點。TreeMap存儲key-value對(節點)時,需要根據key對節點進行排序。TreeMap可以保證所有的
key-value對處于有序狀態。同樣,TreeMap也有兩種排序方式: 自然排序、定制排序
? ? 4) WeakHashMap
? ? WeakHashMap與HashMap的用法基本相似。區別在于,HashMap的key保留了對實際對象的"強引用",這意味著只要該HashMap對象不被銷毀,該HashMap所引用的對象就不會被垃圾回收。
但WeakHashMap的key只保留了對實際對象的弱引用,這意味著如果WeakHashMap對象的key所引用的對象沒有被其他強引用變量所引用,則這些key所引用的對象可能被垃圾回收,當垃
圾回收了該key所對應的實際對象之后,WeakHashMap也可能自動刪除這些key所對應的key-value對
? ? 5) IdentityHashMap
? ? IdentityHashMap的實現機制與HashMap基本相似,在IdentityHashMap中,當且僅當兩個key嚴格相等(key1 == key2)時,IdentityHashMap才認為兩個key相等
? ? 6) EnumMap
? ? EnumMap是一個與枚舉類一起使用的Map實現,EnumMap中的所有key都必須是單個枚舉類的枚舉值。創建EnumMap時必須顯式或隱式指定它對應的枚舉類。EnumMap根據key的自然順序
(即枚舉值在枚舉類中的定義順序)
總結
以上是生活随笔為你收集整理的Java数据结构Map遍历和排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive表联合查询语句参考
- 下一篇: Java机器学习库ML之四模型训练和预测