博客
关于我
Java中map按照值(value)排序
阅读量:706 次
发布时间:2019-03-21

本文共 2956 字,大约阅读时间需要 9 分钟。

在Java程序中,Map数据结构常用于存储键值对,能够以较简便的方式管理数据。有时,我们需要按照值的大小对Map中的键值对进行排序。例如,用户可能希望按照数量排序商品的分类,或者按评分排序用户评论。

下面,我们将通过代码示例,展示如何按照值对Map进行排序。

代码示例

package test;import java.util.ArrayList;import java.util.Comparator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;public class T_00 {	public static void main(String[] args) {		Map
m = new LinkedHashMap<>(); m.put("Apple", 3); m.put("Banana", 2); m.put("Pear", 1); m.put("Hotdog", 4); // 遍历当前Map,查看键值对 for (String k : m.keySet()) { System.out.println(k + " " + m.get(k)); } // 按照值排序 Map
m2 = sortMapByValue(m); System.out.println("====按照value排序后===="); for (String k : m2.keySet()) { System.out.println(k + " " + m2.get(k)); } } /** * 将一个Map按照值排序 * @param m 输入的Map * @return 新生成的按值排序后的Map */ public static Map
sortMapByValue(Map
m) { List
> list = new ArrayList<>(m.entrySet()); // 升序排序 list.sort(Entry.comparingByValue()); // 降序排序 list.sort(Entry.comparingByValue(Comparator.reverseOrder())); Map
sortedMap = new LinkedHashMap<>(); for (int i = 0; i < list.size(); i++) { k: var key = list.get(i).getKey(); var value = list.get(i).getValue(); String[] parts = value.toString().split("="); if (parts.length < 2) { continue; } int num = Integer.parseInt(parts[1]); sortedMap.put(key, num); } return sortedMap; }}

代码解释

// 创建一个新的MapMap
m = new LinkedHashMap<>();//添加键值对m.put("Apple", 3);m.put("Banana", 2);m.put("Pear", 1);m.put("Hotdog", 4);// 按照值排序Map
m2 = sortMapByValue(m);// 打印排序后的结果System.out.println("====按照value排序后====");for (String k : m2.keySet()) { System.out.println(k + " " + m2.get(k));}

功能说明

  • 创建和填充Map: 我们首先创建了一个LinkedHashMap对象m,然后添加了四个键值对。LinkedHashMap在默认情况下以插入顺序排列键值对,这对于后续的展示结果来说非常有用。

  • 排序功能: 因为LinkedHashMap本身不具备自定义排序功能,所以我们需要自己实现一个排序方法。我们创建了一个名为sortMapByValue的方法,该方法接收原始的Map对象,并返回一个新生成的排序后的Map对象。

  • 排序逻辑: 在sortMapByValue方法中,我们首先将Map对象的键值对存储到一个ArrayList中。随后,我们对这个列表进行排序。我们使用Comparator接口来定义排序的逻辑,具体来说:

    • list.sort(Entry.comparingByValue())用于升序排序。
    • list.sort(Entry.comparingByValue(Comparator.reverseOrder()))用于降序排序。

    通过这一步骤,我们可以得到一个按值排序后的列表。

  • 分割字符串并重建Map: 重建排序后的Map对象时,我们需要将每个键值对分割成两个部分。因为默认的Map.Entry对象的toString()方法返回的是"key=value"格式的字符串,所以我们使用split("=")方法将其分割为键和值两个部分。值部分被转换为Integer类型后,再放入新的Map对象中。

  • 输出结果: 最后,我们输出了排序后的结果,供开发人员检查。

  • 运行结果示意

    运行代码后,您可以在相应的编译环境中查看输出结果。假设没有出现编译错误,那么输出应该是这样的:

    Apple 3Banana 2Pear 1Hotdog 4====按照value排序后====Pear 1Banana 2Apple 3Hotdog 4

    开发注意事项

    在实际开发中,您需要注意以下几点:

  • 类型安全: 确保在解析值时不会出现类型转换错误。在sortMapByValue方法中,我们对value转换为Integer类型时,需要使用Integer.parseInt方法。虽然fixed-size类型会给出更可靠的结果,但Integer.parseInt仍然是最常用的方法。

  • 键值对的格式: 确保键值对在toString()方法中的格式一致。例如,如果Map.EntrytoString()方法的输出格式不确定,可能会导致split方法分割出来的键值对数目不正确。

  • 性能考虑: 如果处理的Map对象非常大,建议使用更高效的数据结构和算法优化。例如,TreeMap在排序方面的性能可能更优于LinkedHashMap

  • 异常处理: 在实际应用中,可能还需要添加异常处理代码,以应对可能的输入数据异常情况。

  • 结论

    通过以上方法,您可以轻松地将Map对象按照键或值对进行排序。在实际开发中,Comparator接口是一个非常强大的工具,可以用来对各种自定义对象的排序。

    转载地址:http://pjtez.baihongyu.com/

    你可能感兴趣的文章
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>
    MySQL 存储过程参数:in、out、inout
    查看>>
    mysql 存储过程每隔一段时间执行一次
    查看>>
    mysql 存在update不存在insert
    查看>>
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>
    mysql 实现主从复制/主从同步
    查看>>
    mysql 审核_审核MySQL数据库上的登录
    查看>>
    mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
    查看>>
    mysql 导入导出大文件
    查看>>
    MySQL 导出数据
    查看>>
    mysql 将null转代为0
    查看>>
    mysql 常用
    查看>>
    MySQL 常用列类型
    查看>>