温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Comparator 如何实现分组

发布时间:2026-10-24 10:16:18 来源:亿速云 阅读:99 作者:小樊 栏目:编程语言

在 Java 中,Comparator 本身不是用来“分组”的,它是用来定义排序规则的。但你可以结合 Comparator + Stream / Collectors.groupingBy 来实现“按某种规则分组”或“分组内排序”。

下面按常见场景说明。


一、按字段分组(最常用)

示例:按年龄分组

List<Person> list = ...;

Map<Integer, List<Person>> groupByAge =
    list.stream()
        .collect(Collectors.groupingBy(Person::getAge));

✅ 这里不需要 Comparator,用 groupingBy 即可。


二、分组后组内排序(Comparator 出场)

示例:按年龄分组,组内按姓名排序

Map<Integer, List<Person>> result =
    list.stream()
        .collect(Collectors.groupingBy(
            Person::getAge,
            Collectors.collectingAndThen(
                Collectors.toList(),
                l -> {
                    l.sort(Comparator.comparing(Person::getName));
                    return l;
                }
            )
        ));

三、用 Comparator 实现“自定义分组规则”

比如:

  • 年龄 < 18 为“未成年”
  • 否则为“成年”
Function<Person, String> groupRule = p ->
    p.getAge() < 18 ? "未成年" : "成年";

Map<String, List<Person>> map =
    list.stream()
        .collect(Collectors.groupingBy(groupRule));

四、先排序再分组(分组保持顺序)

List<Person> sorted = list.stream()
    .sorted(Comparator.comparing(Person::getAge))
    .collect(Collectors.toList());

Map<Integer, List<Person>> map =
    sorted.stream()
          .collect(Collectors.groupingBy(Person::getAge));

五、多级分组 + 排序(常见业务写法)

Map<Integer, Map<String, List<Person>>> map =
    list.stream()
        .collect(Collectors.groupingBy(
            Person::getAge,
            Collectors.groupingBy(Person::getCity)
        ));

六、总结一句话

需求 用什么
分组 Collectors.groupingBy
排序 Comparator
分组 + 排序 groupingBy + Comparator
自定义分组 Function

如果你有具体业务场景(比如按区间、按状态、按字符串长度),可以直接贴代码,我帮你写完整示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手