主要分兩種,按鍵排序、按值排序。 而且,按key排序主要用於TreeMap,而按value排序則對於Map的子類們都適用。
一、按鍵排序
按Key排序主要用於TreeMap,可以實現按照Key值的大小,在對象插入時直接插入到合適的位置,保持Map的順序性。
來看TreeMap的構造函數:TreeMap(Comparator<? super K> comparator):
構造一個新的、空的樹映射,該映射根據給定比較器進行排序。
這里的比較器是key的比較器。所以定義比較器時用於比較的兩個參數是Key的數據類型的對象。
實例代碼如下:
public class MapSortTest { public static void main(String[] args) { Map<String,String> stu=new TreeMap<>(new MyComparator());//傳進來一個key的比較器對象來構造treemap stu.put("apple", "55"); stu.put("boy", "32"); stu.put("cat", "22"); stu.put("dog", "12"); stu.put("egg", "11"); //map的遍歷:把key抽取出來用set存放,然后用迭代器遍歷keyset,同時用map.get(KEY)獲取key所對應的value。 Set<String> keySet=stu.keySet(); Iterator it=keySet.iterator(); while (it.hasNext()) { String next = (String)it.next(); System.out.println(next+","+stu.get(next)); } } } //定義key的比較器,比較算法根據第一個參數o1,小於、等於或者大於o2分別返回負整數、0或者正整數,來決定二者存放的先后位置:返回負數則o1在前,正數則o2在前。 class MyComparator implements Comparator<String>{ public int compare(String o1, String o2) { return o1.compareTo(o2); } }
二、按值排序
與按值排序只使用TreeMap不同,按值排序由於其方法所用到的類型的統一性,所以能用於Map的所有子類。
主要用到的知識點有;
1:map.entrySet()將map里的每一個鍵值對取出來封裝成一個Entry對象並存放到一個Set里面。
2:泛型Map.Entry<type1,type2> 因為Key-value對組成Entry對象,此處指明Entry對象中這兩個成員的數據類型。
3:Collections.sort(List<T> list, Comparator<? super T> c) 集合類的排序方法,通過自定義的比較器進行排序。這里的list存放的對象是entry對象。定義比較器對entry對象中的value屬性進行比較。
實例代碼如下:
public class MapSortTest { public static void main(String[] args) { Map<String,String> stu=new TreeMap<>();//用TreeMap儲存 // Map<String,String> stu=new HashMap<>();//用HashMap儲存 stu.put("apple", "55"); stu.put("boy", "32"); stu.put("cat", "22"); stu.put("dog", "12"); stu.put("egg", "11"); //1:把map轉換成entryset,再轉換成保存Entry對象的list。 List<Map.Entry<String,String>> entrys=new ArrayList<>(stu.entrySet()); //2:調用Collections.sort(list,comparator)方法把Entry-list排序 Collections.sort(entrys, new MyComparator()); //3:遍歷排好序的Entry-list,可得到按順序輸出的結果 for(Map.Entry<String,String> entry:entrys){ System.out.println(entry.getKey()+","+entry.getValue()); } } } //自定義Entry對象的比較器。每個Entry對象可通過getKey()、getValue()獲得Key或Value用於比較。換言之:我們也可以通過Entry對象實現按Key排序。 class MyComparator implements Comparator<Map.Entry>{ public int compare(Map.Entry o1, Map.Entry o2) { return ((String)o1.getValue()).compareTo((String)o2.getValue()); } }