天天看點

Map根據鍵、值進行排序

1、Map的周遊方式

keySet() 和 entrySet() 兩種方式

keySet():通過該方法可以擷取 Map 中的全部 key 值,傳回的是一個 set 集合。

entrySet(): Entry 是 Map 底層中數組中存儲的資料節點,Entry表示了一對鍵和值。

Map<String, Integer> map = new HashMap<>();
map.put("zhangsan", 10);
map.put("lisi", 8);
map.put("wangwu", 18);

//1.使用keySet
Set<String> keySet = map.keySet();
//1.1 使用疊代器
Iterator<String> setIterator = keySet.iterator();
while(setIterator.hasNext()) {
    String key = setIterator.next();
    Object value = map.get(key);
    System.out.println("1.1:::key::" + key + "::value::" + value);
}
        
//1.2 使用增強for周遊set集合
for(String key:keySet) {
    System.out.println("1.2:::key::" + key + "::value::" + map.get(key));
}
        
//2. 使用entrySet
Set<Entry<String, Integer>> entrySet = map.entrySet();
//2.1 使用疊代器
Iterator<Map.Entry<String, Integer>> iterator2 = entrySet.iterator();
while(iterator2.hasNext()) {
    Map.Entry<String, Integer> entry = iterator2.next();
    System.out.println("2.1:::key::" + entry.getKey() + "::value::" + entry.getValue());
}
//2.2 使用for循環
for(Entry<String, Integer> entry:entrySet) {
    System.out.println("2.2:::key::" + entry.getKey() + "::value::" + entry.getValue());
}           

2、Map根據鍵、值進行排序

根據 entrySet() 得到 Map.Entry 節點的 Set 集合,接着将其轉換為 list ,然後對 list 排序即可。

2.1 根據 Value 由大到小排序
Map<String, Integer> map = new HashMap<>();
map.put("zhangsan", 10);
map.put("lisi", 8);
map.put("wangwu", 18);
//得到Map中的Entry節點
Set<Map.Entry<String, Integer>> set = map.entrySet();  
//将Set轉換為List類型
List<Map.Entry<String, Integer>> list = new ArrayList<Entry<String,Integer>>(set); 
//對list中的資料根據Value值進行排序
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            return (o2.getValue() - o1.getValue());  //降序排序
    } 
});
//list是排完序的
for(Map.Entry<String, Integer> t:list) { 
    System.out.println(t.getKey() + "::" + t.getValue()); 
}           
2.2 根據 key 由大到小排序
Map<Integer, Integer> map = new HashMap<>();
map.put(2, 10);
map.put(10, 8);
map.put(1, 18);

Set<Map.Entry<Integer, Integer>> set = map.entrySet();
List<Map.Entry<Integer, Integer>> list = new ArrayList<Entry<Integer,Integer>>(set); 
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
    public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
        return (o2.getKey() - o1.getKey());   //降序排序
    } 
});
for(Map.Entry<Integer, Integer> t:list) { 
    System.out.println(t.getKey() + "::" + t.getValue()); 
}           

3、TreeMap

HashMap 是 以空間換時間 的映射表,它内部的 Key 是無序的。

SortedMap 在内部會對 Key 進行排序,SortedMap 是一個接口,實作類是 TreeMap。但是需要注意的是,使用TreeMap 時,放入的 Key 必須實作 Comparable 接口,String、Integer這些類已經實作了 Comparable 接口。如果作為 Key 的 class 沒有實作 Comparable 接口,在建立 TreeMap 時同時指定一個自定義排序算法。

參考文章:

Map的底層實作原理 hashMap根據value排序 面試回答之HashMap 使用TreeMap
上一篇: PKMS總結
下一篇: ECS使用體驗