Map排序(按key排序,按value排序)


  主要分兩種,按鍵排序、按值排序。 而且,按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());
      } 
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM