Java基础知识--map排序的实现
要实现Map的排序功能,需要借助Comparable接口的compareTo方法进行对比,比较的思路是把map转换成一个Set集合,然后通过转换成Stream(流),来使用它的sort方法,进行排序,最后通过Collectors.toMap()方法来把结果返回来.
map集合排序工具类:
1 public class MapSortUtil { 2 private static Comparator<Map.Entry> comparatorByKeyAsc = (Map.Entry o1,Map.Entry o2)->{ 3 if (o1.getKey() instanceof Comparable){ 4 return ((Comparable) o1.getKey()).compareTo(o2.getKey()); 5 } 6 throw new UnsupportedOperationException("键的类型尚未实现Comparable接口"); 7 }; 8 9 private static Comparator<Map.Entry> comparatorByKeyDesc = (Map.Entry o1,Map.Entry o2) ->{ 10 if (o1.getKey() instanceof Comparable){ 11 return ((Comparable) o2.getKey()).compareTo(o1.getKey()); 12 } 13 throw new UnsupportedOperationException("键的类型尚未实现Comparable接口"); 14 }; 15 16 private static Comparator<Map.Entry> comparatorByValueAsc = (Map.Entry o1,Map.Entry o2) ->{ 17 if (o1.getValue() instanceof Comparable){ 18 return ((Comparable) o1.getValue()).compareTo(o2.getValue()); 19 } 20 throw new UnsupportedOperationException("值的类型尚未实现Comparable接口"); 21 }; 22 23 private static Comparator<Map.Entry> comparatorByValueDesc = (Map.Entry o1,Map.Entry o2) ->{ 24 if (o1.getValue() instanceof Comparable){ 25 return ((Comparable) o2.getValue()).compareTo(o1.getValue()); 26 } 27 throw new UnsupportedOperationException("值的类型尚未实现Comparable接口"); 28 }; 29 30 /** 31 * 按键升序排列 32 * @param originMap 33 * @param <K> 34 * @param <V> 35 * @return 36 */ 37 public static <K, V> Map<K, V> sortByKeyAsc(Map<K, V> originMap) { 38 if (originMap == null) { 39 return null; 40 } 41 return sort(originMap, comparatorByKeyAsc); 42 } 43 44 /** 45 * 按键降序排列 46 * @param originMap 47 * @param <K> 48 * @param <V> 49 * @return 50 */ 51 public static <K, V> Map<K, V> sortByKeyDesc(Map<K, V> originMap) { 52 if (originMap == null) { 53 return null; 54 } 55 return sort(originMap, comparatorByKeyDesc); 56 } 57 58 /** 59 * 按值升序排列 60 * @param originMap 61 * @param <K> 62 * @param <V> 63 * @return 64 */ 65 public static <K, V> Map<K, V> sortByValueAsc(Map<K, V> originMap) { 66 if (originMap == null) { 67 return null; 68 } 69 return sort(originMap, comparatorByValueAsc); 70 } 71 72 /** 73 * 按值降序排列 74 * @param originMap 75 * @param <K> 76 * @param <V> 77 * @return 78 */ 79 public static <K, V> Map<K, V> sortByValueDesc(Map<K, V> originMap) { 80 if (originMap == null) { 81 return null; 82 } 83 return sort(originMap, comparatorByValueDesc); 84 } 85 86 /** 87 * 排序逻辑的实现 88 * @param originMap 需要排序的map集合 89 * @param comparator 排序的方式 90 * @param <K> 91 * @param <V> 92 * @return 返回一个排序好的map集合 93 * stream方法:返回一个顺序Stream与此集合作为其来源。把集合操作改成流管道的操作. 94 * sorted方法:返回由该流的元素组成的流,根据提供的 Comparator进行排序。 95 * collect方法:流操作,使用 Collector对此流的元素执行 mutable reduction Collector 。 96 * Collectors.toMap方法:返回一个 Collector ,它将元素累加到一个 Map ,其键和值是将所提供的映射函数应用于输入元素的结果。 97 */ 98 private static <K, V> Map<K, V> sort(Map<K, V> originMap, Comparator<Map.Entry> comparator) { 99 return originMap.entrySet() 100 .stream() 101 .sorted(comparator) 102 .collect( 103 Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, 104 LinkedHashMap::new)); 105 } 106 107 }
测试类:
1 public class MapSortTest { 2 public static void main(String[] args) { 3 Map<String,String> map = new HashMap<>(); 4 map.put("1","java"); 5 map.put("2","python"); 6 map.put("3","c"); 7 map.put("4","c#"); 8 map.put("5","php"); 9 //开始对map进行排序 10 System.out.println("按键升序:"+MapSortUtil.sortByKeyAsc(map)); 11 System.out.println(); 12 System.out.println("按键降序:"+MapSortUtil.sortByKeyDesc(map)); 13 System.out.println(); 14 System.out.println("按值升序:"+MapSortUtil.sortByValueAsc(map)); 15 System.out.println(); 16 System.out.println("按值降序:"+MapSortUtil.sortByValueDesc(map)); 17 } 18 }
测试结果: