博客
关于我
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:ORA-00911: 无效字符
    查看>>
    Text-to-Image with Diffusion models的巅峰之作:深入解读 DALL·E 2
    查看>>
    Tensorflow.python.framework.errors_impl.ResourceExhaustedError:无法分配内存[操作:AddV2]
    查看>>
    TCP基本入门-简单认识一下什么是TCP
    查看>>
    tableviewcell 中使用autolayout自适应高度
    查看>>
    Symbolic Aggregate approXimation(SAX,符号聚合近似)介绍-ChatGPT4o作答
    查看>>
    Orcale表被锁
    查看>>
    svn访问报错500
    查看>>
    sum(a.YYSR) over (partition by a.hy_dm) 不需要像group by那样需要分组函数。方便。
    查看>>
    ORCHARD 是什么?
    查看>>
    Struts2中使用Session的两种方法
    查看>>
    order by rand()
    查看>>
    Orderer节点启动报错解决方案:Not bootstrapping because of 3 existing channels
    查看>>
    org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement profile
    查看>>
    org.apache.commons.beanutils.BasicDynaBean cannot be cast to ...
    查看>>
    org.apache.dubbo.common.serialize.SerializationException: com.alibaba.fastjson2.JSONException: not s
    查看>>
    sqlserver学习笔记(三)—— 为数据库添加新的用户
    查看>>
    org.apache.ibatis.exceptions.PersistenceException:
    查看>>
    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned
    查看>>
    org.apache.ibatis.type.TypeException: Could not resolve type alias 'xxxx'异常
    查看>>