Java中按Key对Map进行字母升序排序的问题求助
两种简洁的有序Map实现方案
方案1:使用TreeMap自动排序(推荐)
直接在Collectors.toMap中指定TreeMap作为结果容器,TreeMap会自动按照key的自然顺序(字符串字母升序)排序,无需额外处理:
// provinceName is key public Map<String, String> regionMap() { return em.createQuery( """ SELECT DISTINCT p.provinceName AS prov_id ,p.provinceAbbreviation AS prov_value FROM CanadianPersonalIncomeTaxRate p """, Tuple.class ) .getResultStream() .collect( Collectors.toMap( tuple -> tuple.get(0, String.class), tuple -> tuple.get(1, String.class), // 处理key冲突(重复key时用新值覆盖旧值) (existing, replacement) -> replacement, // 指定结果容器为TreeMap,自动按key升序排序 TreeMap::new ) ); }
说明:如果查询结果不会出现重复的provinceName,合并逻辑可以随意定义;TreeMap会自动完成字母升序排序,代码最简洁省心。
方案2:流排序+LinkedHashMap保留顺序
如果需要自定义排序规则,或者依赖JPQL的排序结果,可以先对流排序,再收集到LinkedHashMap中保留顺序:
// provinceName is key public Map<String, String> regionMap() { return em.createQuery( """ SELECT DISTINCT p.provinceName AS prov_id ,p.provinceAbbreviation AS prov_value FROM CanadianPersonalIncomeTaxRate p """, Tuple.class ) .getResultStream() // 按provinceName字母升序排序,可自定义排序逻辑(比如忽略大小写) .sorted(Comparator.comparing(tuple -> tuple.get(0, String.class))) .collect( Collectors.toMap( tuple -> tuple.get(0, String.class), tuple -> tuple.get(1, String.class), (existing, replacement) -> replacement, // 指定LinkedHashMap保留流的排序顺序 LinkedHashMap::new ) ); }
说明:如果JPQL已经添加了ORDER BY p.provinceName ASC,可以省略流的sorted步骤,直接收集到LinkedHashMap也能保留查询的排序结果。
内容的提问来源于stack exchange,提问作者CheckDeck
相关产品推荐
相关产品推荐

