對HashMap進行排序


首先來看看Map集合獲取元素的三種常見方法keySet()、values()、entrySet()

1. values():返回map集合的所有value的Collection集合(於集合中無序存放)

 1 import java.util.*;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //構建鍵值對為<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9     
10         Collection<String> collection = map.values();    //獲取map集合的所有value的Collection集合(於集合中無序存放)
11         System.out.println(collection);
12     }
13 }
14 
15 /**
16  * 運行結果
17  * [bbb, ccc, aaa]
18  */

2. keySet():返回map集合的所有鍵的Set集合(於Set集合中無序存放)

通過迭代取出所有key,再利用get()方法獲取value, for(類型 元素: 集合) 的本質是獲取集合的迭代器進行迭代

 1 import java.util.*;
 2  
 3 public class Main{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //構建鍵值對為<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9         
10         Set<String> keySet = map.keySet();    //獲取map集合的所有鍵的Set集合(於Set集合中無序存放)
11         Iterator<String> iter = keySet.iterator();    //獲取keySet集合的迭代器
12         while(iter.hasNext()){
13             String key = iter.next();
14             String value = map.get(key);
15             System.out.println("key:" + key + "-->value:" + value);
16         }
17         /*
18         for(String key: keySet){
19             String value = map.get(key);
20             System.out.println("key:" + key + "-->value:" + value);
21         }
22         */
23     }
24 }
25 
26 /**
27  * 運行結果
28  * key:b-->value:bbb
29  * key:c-->value:ccc
30  * key:a-->value:aaa
31  */

3. entrySet():返回map集合的所有"映射"的Set集合,這里規范每個"映射"的類型為Map.Entry<K, V>(於Set集合中無序存放)

通過迭代取出所有的“映射”,再利用getKey()、getValue()方法獲取相應鍵、值

 1 import java.util.*;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //構建鍵值對為<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9     
10         Set<Map.Entry<String, String>> entrySet = map.entrySet();    //獲取map集合的所有"映射"的Set集合,這里規范每個映射的類型為Map.Entry<K, V>(於Set集合中無序存放)
11         Iterator<Map.Entry<String, String>> iter = entrySet.iterator();    //獲取entrySet集合的迭代器,Map.Entry<K, V>為迭代元素的類型
12         while(iter.hasNext()){
13             Map.Entry<String, String> item = iter.next();
14             String key = item.getKey();
15             String value = item.getValue();
16             System.out.println("key:" + key + "-->value:" + value);
17         }
18         /*
19         for(Map.Entry<String, String> item: entrySet){
20             String key = item.getKey();
21             String value = item.getValue();
22             System.out.println("key:" + key + "-->value:" + value);
23         }
24         */
25     }
26 }
27 
28 /**
29  * 運行結果
30  * key:b-->value:bbb
31  * key:c-->value:ccc
32  * key:a-->value:aaa
33  */

 


 

有以上方法作為基礎,那么我們很容易想到對HashMap進行排序的兩種方法

1. 通過keySet()獲取Map集合的所有鍵的Set集合,由List集合獲取其中所有元素,通過比較器對元素為鍵的List集合進行排序

2. 通過entrySet()獲取Map集合所有映射的Set集合,由List集合獲取其中所有元素,通過比較器對元素為"映射"List集合進行排序

通過對比較器compare方法的Override,兩者還可以實現利用value進行排序。有關java中Comparable和Comparator比較的詳解

 1 import java.util.*;
 2 
 3 public class DescKeyComparator implements Comparator<String>{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //構建鍵值對為<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9     
10         Set<String> entrySet = map.keySet();    //獲取map集合的所有鍵的Set集合(於Set集合中無序存放)
11         List<String> list = new ArrayList<String>(entrySet);    //新建List集合獲取Set集合的所有元素(鍵對象)(順序與Set集合一樣)
12         /** 
13          * 接下來的排序是list的專長了
14          * 通過“比較器(DescKeyComparator)”,對list進行排序
15          */
16         Collections.sort(list, new DescKeyComparator());
17         /*
18         Collections.sort(list);    //String實現了Comparable,默認升序排列
19         */
20         Iterator<String> iter = list.iterator();    //獲取List集合的迭代器,String為迭代元素的類型
21         while(iter.hasNext()){
22             String key = iter.next();
23             String value = map.get(key);
24             System.out.println("key:" + key + "-->value:" + value);
25         }
26         /*
27         for(Map.Entry<String, String> item: list){
28             String key = iter.next();
29             String value = map.get(key);
30             System.out.println("key:" + key + "-->value:" + value);
31         }
32         */
33     }
34     
35     @Override
36     public int compare(String key1, String key2){
37         return key2.compareTo(key1);    //降序排序; String作為api提供的類,實現了Comparable的compareTo方法被設計成小於、等於、大於分別返回負數、零、正數
38     }
39 }
40 
41 /**
42  * 運行結果
43  * key:c-->value:ccc
44  * key:b-->value:bbb
45  * key:a-->value:aaa
46  */

 

 1 import java.util.*;
 2 
 3 public class AscKeyComparator implements Comparator<Map.Entry<String, String>>{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //構建鍵值對為<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9     
10         Set<Map.Entry<String, String>> entrySet = map.entrySet();    //獲取map集合的所有"映射"的Set集合,這里規范每個映射的類型為Map.Entry<K, V>(於Set集合中無序存放)
11         List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(entrySet);    //新建List集合獲取Set集合的所有元素("映射"對象)(順序與Set集合一樣)
12         /** 
13          * 接下來的排序是list的專長了
14          * 通過“比較器(AscKeyComparator)”,對list進行排序
15          */
16         Collections.sort(list, new AscKeyComparator());
17         
18         Iterator<Map.Entry<String, String>> iter = list.iterator();    //獲取List集合的迭代器,Map.Entry<K, V>為迭代元素的類型
19         while(iter.hasNext()){
20             Map.Entry<String, String> item = iter.next();
21             String key = item.getKey();
22             String value = item.getValue();
23             System.out.println("key:" + key + "-->value:" + value);
24         }
25         /*
26         for(Map.Entry<String, String> item: list){
27             String key = item.getKey();
28             String value = item.getValue();
29             System.out.println("key:" + key + "-->value:" + value);
30         }
31         */
32     }
33     
34     @Override
35     public int compare(Map.Entry<String, String> item1, Map.Entry<String, String> item2){
36         return item1.getKey().compareTo(item2.getKey());    //升序排序
37     }
38 }
39 
40 /**
41  * 運行結果
42  * key:a-->value:aaa
43  * key:b-->value:bbb
44  * key:c-->value:ccc
45  */

 


免責聲明!

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



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