gpt4 book ai didi

java - 使用不等键提取器和分类器函数对列表进行分组

转载 作者:行者123 更新时间:2023-12-02 14:38:29 25 4
gpt4 key购买 nike

我想对提交列表(类 LegacyCommit )中的元素进行分组,以便对同一用户的所有提交都属于其自己的映射中。

这是首先获取 nonDistinctCommits 的代码

Map<Boolean, List<LegacyCommit>> partitionedCommits = pushEvent.getCommits().stream()
.collect(Collectors.partitioningBy(LegacyCommit::isDistinct));

List<LegacyCommit> distinctCommits = partitionedCommits.get(true);
List<LegacyCommit> nonDistinctCommits = partitionedCommits.get(false);

现在我想获得一个Map<LegacyUser, List<LegacyCommit>>通过分组commit -> commit.getCommitter().getUsername() ,但是我遇到了两种都不起作用的情况:

情况1

Map<LegacyUser, List<LegacyCommit>> committerGroupedNonDistinctCommits = nonDistinctCommits.stream()
.collect(Collectors.groupingBy(LegacyCommit::getCommitter));

这很接近,但映射到 LegacyCommiter::getCommitter ,其中没有 equals()定义的方法我也不想通过这种方式来完成。

所以我使用 end up in...

情况2

我想对用户名进行分组,同时存储 LegacyUser在 map 作为关键,我尝试这样做:

Map<LegacyUser, List<LegacyCommit>> committerGroupedNonDistinctCommits = nonDistinctCommits.stream()
.collect(Collectors.groupingBy(commit -> commit.getCommitter().getUsername(), Collectors.mapping(LegacyCommit::getCommitter, Collectors.toList())));

但是由于类型参数错误,它无法编译。

所以问题如下:

如何获得 Map<LegacyUser, List<LegacyCommit>>来自List<LegacyCommit>分组 commit -> commit.getComitter().getUsername()

最佳答案

我假设用户名是一个字符串(尽管任何Comparable都可以使用此解决方案)。然后,您可以按提交者分组到一个排序的映射中,该映射按提交者用户名排序:

Map<LegacyUser, List<LegacyCommit>> committerGroupedNonDistinctCommits =
nonDistinctCommits.stream().collect(Collectors.groupingBy(
LegacyCommit::getCommitter,
()->new TreeMap<>(Comparator.comparing(LegacyUser::getUserName)),
Collectors.toList()));

排序映射会将键视为相等,这些键根据 Comparator 相等,group by Collector 将使用提供的 map 。因此,当 LegacyUser 没有 equals 方法时,这并不重要。

关于java - 使用不等键提取器和分类器函数对列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25551959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com