You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对存储HashMap的ArrayList按指定Key排序或反转?

可以按HashMap的指定Key对ArrayList排序或反转

当然可以,不管是按HashMap里指定Key的值对ArrayList排序,还是直接反转整个列表,都能轻松实现,下面给你对应代码示例:

按name字段排序(字符串字典序)

可以用Collections.sort()或者Java 8+的List.sort()方法,通过自定义比较器实现按name升序排序:

// 传统写法(兼容Java 7及以下)
Collections.sort(list, new Comparator<HashMap<String, String>>() {
    @Override
    public int compare(HashMap<String, String> o1, HashMap<String, String> o2) {
        String name1 = o1.get("name");
        String name2 = o2.get("name");
        // 处理name为null的情况,避免空指针
        return name1 == null ? -1 : name2 == null ? 1 : name1.compareTo(name2);
    }
});

// Java 8+简化写法
list.sort((o1, o2) -> {
    String name1 = o1.get("name");
    String name2 = o2.get("name");
    return name1 == null ? -1 : name2 == null ? 1 : name1.compareTo(name2);
});

执行后列表会按name的字典序排列,输出结果:

[{name=adam, age=15, hobby=sports}, {name=dave, age=27, hobby=guitar}]

如果要降序,只需要把name1.compareTo(name2)改成name2.compareTo(name1)即可。

按age字段排序(数值排序)

注意你的age是字符串类型,直接按字符串比较会出现逻辑错误(比如"100"会被认为比"27"小),所以必须先转成整数再比较:

list.sort((o1, o2) -> {
    try {
        int age1 = Integer.parseInt(o1.get("age"));
        int age2 = Integer.parseInt(o2.get("age"));
        // 升序排序,降序则改成Integer.compare(age2, age1)
        return Integer.compare(age1, age2);
    } catch (NumberFormatException e) {
        // 处理age不是有效数字的情况,这里把非数字项放到列表末尾
        return 1;
    }
});

执行后列表按age从小到大排列,输出结果和按name升序的结果一致(因为adam的age更小)。

反转ArrayList

直接使用Collections.reverse()方法就能反转整个列表的顺序:

Collections.reverse(list);

原列表是[{name=dave,...}, {name=adam,...}],反转后变为:

[{name=adam, age=15, hobby=sports}, {name=dave, age=27, hobby=guitar}]

额外技巧:用Stream生成新的排序列表

如果不想修改原列表,可以用Java 8+的Stream API生成一个新的排序后的列表:

import java.util.stream.Collectors;

// 按name升序生成新列表
List<HashMap<String, String>> sortedList = list.stream()
    .sorted((o1, o2) -> {
        String name1 = o1.get("name");
        String name2 = o2.get("name");
        return name1 == null ? -1 : name2 == null ? 1 : name1.compareTo(name2);
    })
    .collect(Collectors.toList());

注意事项

  • 一定要处理Key不存在或值为null的情况,否则会抛出NullPointerException;
  • 像age这种数值型的字符串,必须转成对应的数值类型再比较,避免字符串排序的逻辑错误;
  • 如果你的Java版本低于8,只能用Collections.sort()结合匿名内部类的写法。

内容的提问来源于stack exchange,提问作者kee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:37:46