面試官出的題:html
給你一組學生的成績信息,key 爲學生姓名,value 爲成績,而後根據value 進行排序。java
說實話,面試官問到個人時候,真的挺崩潰的,本身的算法原本就很差,對這個又不是很熟悉,因此當時很緊張的,不過還好,在面試初期遇到了這些問題,還有的補。面試
下面我就簡要的對map進行簡單的介紹和各map排序算法
A Map
is an object that maps keys to values. A map cannot contain duplicate keys: Each key can map to at most one value. api
The Map
interface includes methods for basic operations (such as put
, get
, remove
,containsKey
, containsValue
, size
, and empty
), bulk operations (such as putAll
and clear
), and collection views (such as keySet
, entrySet
, and values
).數組
The Java platform contains three general-purpose Map
implementations: HashMap
, TreeMap
, and LinkedHashMap
. oracle
HashMap:咱們最經常使用的Map,它根據key的HashCode 值來存儲數據,根據key能夠直接獲取它的Value,同時它具備很快的訪問速度。HashMap最多隻容許一條記錄的key值爲Null(多條會覆蓋);容許多條記錄的Value爲 Null。非同步的。
ide
TreeMap: 可以把它保存的記錄根據key排序,默認是按升序排序,也能夠指定排序的比較器,當用Iterator 遍歷TreeMap時,獲得的記錄是排過序的。TreeMap不容許key的值爲null。非同步的。spa
LinkedHashMap: 保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先獲得的記錄確定是先插入的.在遍歷的時候會比HashMap慢。key和value均容許爲空,非同步的。線程
Hashtable: 與 HashMap相似,不一樣的是:key和value的值均不容許爲null;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,所以也致使了Hashtale在寫入時會比較慢。
下面咱們就看一下個map的排序
TreeMap默認是升序的,若是咱們須要改變排序方式,則須要使用比較器:Comparator。
Comparator能夠對集合對象或者數組進行排序的比較器接口,實現該接口的public compare(T o1,To2)方法便可實現排序,該方法主要是根據第一個參數o1,小於、等於或者大於o2分別返回負整數、0或者正整數。
package cn.edu.ytu.botao.java.map; import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeMap; /** * 因爲treemap 默認是排序的,且是升序的,若是咱們要改變排列方式,可使用比較器: compartor * @author botao * */ public class TreeMapSort { public static void main(String[] args) { //默認的TreeMap TreeMap<String, String> treeMap1 = new TreeMap<>(); //建立Treemap對象,實現Compartor接口 TreeMap<String, String> treeMap2 = new TreeMap<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { // TODO Auto-generated method stub //比較 o1 和 o2 return o2.compareTo(o1); } }); treeMap1.put("c", "cccc"); treeMap2.put("c", "cccc"); treeMap1.put("a", "aaaa"); treeMap2.put("a", "aaaa"); treeMap1.put("b", "bbbb"); treeMap2.put("b", "bbbb"); //獲得keyset集合 Set<String> keySet1 = treeMap1.keySet(); Set<String> keySet2 = treeMap2.keySet(); //獲得迭代器 Iterator<String> iterator1 = keySet1.iterator(); Iterator<String> iterator2 = keySet2.iterator(); //默認順序輸出 while (iterator1.hasNext()) { String key = (String) iterator1.next(); System.out.println(key + " : " + treeMap1.get(key)); } //咱們實現了compartor , 改變默認排序 while (iterator2.hasNext()) { String key = (String) iterator2.next(); System.out.println(key + " :: " + treeMap2.get(key)); } } }
輸出結果:
a : aaaa
b : bbbb
c : cccc
c :: cccc
b :: bbbb
a :: aaaa
上面的例子對根據TreeMap的key值來進行排序的,可是咱們的需求是據TreeMap的value來進行排序。對value排序咱們就須要藉助於Collections的sort(List<T> list, Comparator<? super T> c)方法,該方法根據指定比較器產生的順序對指定列表進行排序
示例
package cn.edu.ytu.botao.java.map; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; /** * TreeMap 默認是對key進行排序 如今是根據value進行排序 * @author botao * */ public class TreeMapSortByValue { public static void main(String[] args) { //先建立TreeMap對象 TreeMap<String, String> treeMap = new TreeMap<>(); //填充map treeMap.put("c", "cccc"); treeMap.put("a", "aaaa"); treeMap.put("b", "bbbb"); //將map轉化爲 list List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(treeMap.entrySet()); //經過比較器對list進行排序 Collections.sort(list, new Comparator<Map.Entry<String, String>>() { @Override public int compare(Entry<String, String> o1, Entry<String, String> o2) { // TODO Auto-generated method stub return o1.getValue().compareTo(o2.getValue()); } }); //對結果進行輸出 for (Entry<String, String> entry : list) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } }
輸出結果:
a : aaaa
b : bbbb
c : cccc
HashMap 默認是不排序的,因此咱們能夠參照咱們上面TreeMap的value排序實現對它們的排序。