博客
关于我
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/

    你可能感兴趣的文章
    oracle 查询clob
    查看>>
    oracle 行转列
    查看>>
    Oracle 表
    查看>>
    Oracle 递归
    查看>>
    oracle 逻辑优化,提升高度,综合SQL上下文进行逻辑优化
    查看>>
    oracle 闪回关闭,关闭闪回即disable flashback的操作步骤
    查看>>
    oracle 限制用户并行,insert /*parallel */ 到不同用户,并行起不来的问题
    查看>>
    oracle--用户,权限,角色的管理
    查看>>
    oracle00205报错,Oracle控制文件损坏报错场景
    查看>>
    Oracle10g EM乱码之快速解决
    查看>>
    Oracle10g下载地址--多平台下的32位和64位
    查看>>
    Oracle10g安装了11g的ODAC后,PL/SQL连接提示TNS:无法解析指定的连接标识符
    查看>>
    Oracle11G基本操作
    查看>>
    Oracle11g服务详细介绍及哪些服务是必须开启的?
    查看>>
    Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
    查看>>
    oracle12安装软件后安装数据库,然后需要自己配置监听
    查看>>
    Oracle——08PL/SQL简介,基本程序结构和语句
    查看>>
    Oracle——distinct的用法
    查看>>
    Oracle、MySQL、SQL Server架构大对比
    查看>>
    oracle下的OVER(PARTITION BY)函数介绍
    查看>>