温馨提示×

温馨提示×

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

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

怎么用 Comparator 分组

发布时间:2026-07-18 13:40:36 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

在 Java 里 Comparator 本身不是用来“分组”的,但可以配合分组操作一起使用。常见做法有下面几种,按使用频率从高到低给你讲清楚。


一、最常见:Comparator + Map 分组(强烈推荐)

示例:按某个字段分组

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

使用 Collectors.groupingBy

List<Person> list = List.of(
    new Person("A", 20),
    new Person("B", 20),
    new Person("C", 30)
);

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

✅ 结果:

20 -> [A, B]
30 -> [C]

二、分组 + 排序(Comparator 出场)

1️⃣ 分组后,组内排序

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 自定义“分组键”(进阶)

场景:年龄按区间分组(不是直接用字段)

Map<String, List<Person>> group =
    list.stream()
        .collect(Collectors.groupingBy(p -> {
            if (p.getAge() < 25) return "青年";
            else return "中年";
        }));

✅ 结果:

青年 -> [A, B]
中年 -> [C]

四、用 Comparator 做“排序 + 分组效果”(容易混淆)

⚠️ Comparator 只能排序,不能直接分组

list.sort(Comparator.comparing(Person::getAge));

这只是:

[20, 20, 30]

不是分组,只是顺序变了。


五、TreeMap + Comparator(有序分组)

按年龄排序并分组

TreeMap<Integer, List<Person>> map =
    list.stream()
        .collect(Collectors.groupingBy(
            Person::getAge,
            TreeMap::new,
            Collectors.toList()
        ));

六、总结对照表

目的 是否用 Comparator 推荐方式
分组 Collectors.groupingBy
分组 + 排序 groupingBy + Comparator
排序 Comparator
有序分组 TreeMap + groupingBy

一句话总结 ✅

Comparator 负责“怎么比”,groupingBy 负责“怎么分”
两者通常 配合使用,而不是替代关系

如果你有具体场景(比如:按多个字段分组?按对象某个规则分组?),可以直接贴代码,我帮你写完整示例。

向AI问一下细节

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

AI