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 }
测试结果:
分类:
Java基础--集合类
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库