Java之Map集合

打印 上一主题 下一主题

主题 679|帖子 679|积分 2037

一、Map

Map是java中的接口,Map.Entry是Map的一个内部接口。
Map提供了一些常用方法,如keySet()、entrySet()等方法。
keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。
  1. Map<String, String> map = new HashMap<String, String>();
  2. map.put(“key1”, “value1”);
  3. map.put(“key2”, “value2”);
  4. map.put(“key3”, “value3”);
复制代码
 
二、遍历

//第一种:普遍使用,二次取值
  1. System.out.println(“通过Map.keySet遍历key和value:”);
  2. for (String key : map.keySet()) {
  3.   System.out.println("key= "+ key + " and value= " + map.get(key));
  4. }
复制代码
 
//第二种
  1. System.out.println(“通过Map.entrySet使用iterator遍历key和value:”);
  2. Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
  3. while (it.hasNext()) {
  4.   Map.Entry<String, String> entry = it.next();
  5.   System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
  6. }
复制代码
 
//第三种:推荐,尤其是容量大时
  1. System.out.println(“通过Map.entrySet遍历key和value”);
  2. for (Map.Entry<String, String> entry : map.entrySet()) {
  3.   System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
  4. }
复制代码
 
//第四种
  1. System.out.println(“通过Map.values()遍历所有的value,但不能遍历key”);
  2. for (String v : map.values()) {
  3.     System.out.println("value= " + v);
  4. }
复制代码
 
三、排序
  1. 1 import java.util.Collections;
  2. 2 import java.util.HashMap;
  3. 3 import java.util.LinkedHashMap;
  4. 4 import java.util.Map;
  5. 5  
  6. 6 import static java.util.Map.Entry.comparingByValue;
  7. 7 import static java.util.stream.Collectors.toMap;
  8. 8  
  9. 9 public class SortTest {
  10. 10  
  11. 11     public static void main(String[] args) throws Exception {
  12. 12  
  13. 13         // 创建一个字符串为Key,数字为值的map
  14. 14         Map<String, Integer> budget = new HashMap<>();
  15. 15         budget.put("clothes", 120);
  16. 16         budget.put("grocery", 150);
  17. 17         budget.put("transportation", 100);
  18. 18         budget.put("utility", 130);
  19. 19         budget.put("rent", 1150);
  20. 20         budget.put("miscellneous", 90);
  21. 21         System.out.println("排序前: " + budget);
  22. 22  
  23. 23         // 按值排序 升序
  24. 24         Map<String, Integer> sorted = budget
  25. 25                 .entrySet()
  26. 26                 .stream()
  27. 27                 .sorted(comparingByValue())
  28. 28                 .collect(
  29. 29                         toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
  30. 30                                 LinkedHashMap::new));
  31. 31  
  32. 32         System.out.println("升序按值排序后的map: " + sorted);
  33. 33  
  34. 34         // 按值排序降序
  35. 35         sorted = budget
  36. 36                 .entrySet()
  37. 37                 .stream()
  38. 38                 .sorted(Collections.reverseOrder(comparingByValue()))
  39. 39                 .collect(
  40. 40                         toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
  41. 41                                 LinkedHashMap::new));
  42. 42  
  43. 43         System.out.println("降序按值排序后的map: " + sorted);
  44. 44     }
  45. 45  
  46. 46  
  47. 47 }
复制代码
 
封装成工具类
  1. 1 /**
  2. 2  * Map排序工具类
  3. 3  *
  4. 4  * 5  */
  5. 6 public class MapSortUtil {
  6. 7     
  7. 8     private static Comparator<Map.Entry> comparatorByKeyAsc = (Map.Entry o1, Map.Entry o2) -> {
  8. 9         if (o1.getKey() instanceof Comparable) {
  9. 10             return ((Comparable) o1.getKey()).compareTo(o2.getKey());
  10. 11         }
  11. 12         throw new UnsupportedOperationException("键的类型尚未实现Comparable接口");
  12. 13     };
  13. 14  
  14. 15  
  15. 16     private static Comparator<Map.Entry> comparatorByKeyDesc = (Map.Entry o1, Map.Entry o2) -> {
  16. 17         if (o1.getKey() instanceof Comparable) {
  17. 18             return ((Comparable) o2.getKey()).compareTo(o1.getKey());
  18. 19         }
  19. 20         throw new UnsupportedOperationException("键的类型尚未实现Comparable接口");
  20. 21     };
  21. 22  
  22. 23  
  23. 24     private static Comparator<Map.Entry> comparatorByValueAsc = (Map.Entry o1, Map.Entry o2) -> {
  24. 25         if (o1.getValue() instanceof Comparable) {
  25. 26             return ((Comparable) o1.getValue()).compareTo(o2.getValue());
  26. 27         }
  27. 28         throw new UnsupportedOperationException("值的类型尚未实现Comparable接口");
  28. 29     };
  29. 30  
  30. 31  
  31. 32     private static Comparator<Map.Entry> comparatorByValueDesc = (Map.Entry o1, Map.Entry o2) -> {
  32. 33         if (o1.getValue() instanceof Comparable) {
  33. 34             return ((Comparable) o2.getValue()).compareTo(o1.getValue());
  34. 35         }
  35. 36         throw new UnsupportedOperationException("值的类型尚未实现Comparable接口");
  36. 37     };
  37. 38  
  38. 39     /**
  39. 40      * 按键升序排列
  40. 41      */
  41. 42     public static <K, V> Map<K, V> sortByKeyAsc(Map<K, V> originMap) {
  42. 43         if (originMap == null) {
  43. 44             return null;
  44. 45         }
  45. 46         return sort(originMap, comparatorByKeyAsc);
  46. 47     }
  47. 48  
  48. 49     /**
  49. 50      * 按键降序排列
  50. 51      */
  51. 52     public static <K, V> Map<K, V> sortByKeyDesc(Map<K, V> originMap) {
  52. 53         if (originMap == null) {
  53. 54             return null;
  54. 55         }
  55. 56         return sort(originMap, comparatorByKeyDesc);
  56. 57     }
  57. 58  
  58. 59  
  59. 60     /**
  60. 61      * 按值升序排列
  61. 62      */
  62. 63     public static <K, V> Map<K, V> sortByValueAsc(Map<K, V> originMap) {
  63. 64         if (originMap == null) {
  64. 65             return null;
  65. 66         }
  66. 67         return sort(originMap, comparatorByValueAsc);
  67. 68     }
  68. 69  
  69. 70     /**
  70. 71      * 按值降序排列
  71. 72      */
  72. 73     public static <K, V> Map<K, V> sortByValueDesc(Map<K, V> originMap) {
  73. 74         if (originMap == null) {
  74. 75             return null;
  75. 76         }
  76. 77         return sort(originMap, comparatorByValueDesc);
  77. 78     }
  78. 79  
  79. 80     private static <K, V> Map<K, V> sort(Map<K, V> originMap, Comparator<Map.Entry> comparator) {
  80. 81         return originMap.entrySet()
  81. 82                 .stream()
  82. 83                 .sorted(comparator)
  83. 84                 .collect(
  84. 85                         Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
  85. 86                                 LinkedHashMap::new));
  86. 87     }
  87. 88  
  88. 89 }
复制代码
  1. 1 package com.chujianyun.common.map;
  2. 2  
  3. 3 import org.junit.jupiter.api.BeforeAll;
  4. 4 import org.junit.jupiter.api.Test;
  5. 5 import org.junit.jupiter.api.TestInstance;
  6. 6  
  7. 7 import java.util.HashMap;
  8. 8 import java.util.Map;
  9. 9  
  10. 10  
  11. 11 /**
  12. 12  * Map排序工具类
  13. 13  *
  14. 14  */
  15. 15 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
  16. 16 class MapSortUtilTest {
  17. 17     // 创建一个字符串为Key,数字为值的map
  18. 18     Map<String, Integer> budget = new HashMap<>();
  19. 19  
  20. 20     @BeforeAll
  21. 21     public void init() {
  22. 22         budget.put("clothes", 120);
  23. 23         budget.put("grocery", 150);
  24. 24         budget.put("transportation", 100);
  25. 25         budget.put("utility", 130);
  26. 26         budget.put("rent", 1150);
  27. 27         budget.put("miscellneous", 90);
  28. 28         System.out.println("排序前: " + budget);
  29. 29     }
  30. 30  
  31. 31     @Test
  32. 32     void sortByKeyAsc() {
  33. 33         System.out.println("按键升序" + MapSortUtil.sortByKeyAsc(budget));
  34. 34     }
  35. 35  
  36. 36     @Test
  37. 37     void sortByKeyDesc() {
  38. 38         System.out.println("按键降序" + MapSortUtil.sortByKeyDesc(budget));
  39. 39     }
  40. 40  
  41. 41     @Test
  42. 42     void sortByValueAsc() {
  43. 43         System.out.println("按值升序" + MapSortUtil.sortByValueAsc(budget));
  44. 44     }
  45. 45  
  46. 46     @Test
  47. 47     void sortByValueDesc() {
  48. 48         System.out.println("按值降序" + MapSortUtil.sortByValueDesc(budget));
  49. 49     }
  50. 50 }
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表