gpt4 book ai didi

java - 如何通过多个属性查找重复对象并合并它们?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:38 26 4
gpt4 key购买 nike

我正在为 MongoDb 中集合之间的数据规范化编写一个验证函数我有一个对象:如下:

class ReleaseTime{
private Date startDate;
private Date endDate;
private List<String> regions;
}

我必须收集所有具有相同 startDate 和相同 endDate 的 ReleaseTime 对象,然后将 Regions 列表合并在一起

我试过下面的代码,但它只是按 startDate 分组

expectedAvailabilities = ungrouppedReleaseTime.stream()
.collect(Collectors.toMap(ReleaseTime::getStartDate,
Function.identity(),
(ReleaseTime tb1, ReleaseTime tb2) ->
{
tb1.getRegions().addAll(tb2.getRegions());
tb2.getRegions().clear();
return tb1;
})
).values();

感谢您的帮助!

最佳答案

这是一种不使用流来做你想做的事情的替代方法:

Map<List<Date>, List<String>> map = new LinkedHashMap<>();
ungrouppedAvailabilites.forEach(a ->
map.computeIfAbsent(Arrays.asList(a.getStartDate(), a.getEndDate()), // or List.of
k -> new ArrayList<>())
.addAll(a.getRegions()));

这使用 Map.computeIfAbsent按开始日期和结束日期对 ReleaseTime 对象的区域进行分组。

如果在分组的 ReleaseTime 对象中有重复的区域并且您不希望重复,您可以使用 Set 而不是 List:

Map<List<Date>, Set<String>> map = new LinkedHashMap<>();
ungrouppedAvailabilites.forEach(a ->
map.computeIfAbsent(Arrays.asList(a.getStartDate(), a.getEndDate()), // or List.of
k -> new LinkedHashSet<>())
.addAll(a.getRegions()));

请注意,我使用 LinkedHashMapLinkedHashSet 来保持元素的插入顺序。


编辑:

如果您需要 ReleaseTime 对象而不仅仅是它们的区域,您可以通过一个额外的步骤来实现它:

Map<List<Date>, ReleaseTime> result = new LinkedHashMap<>();
map.forEach((k, v) ->
result.put(k, new ReleaseTime(k.get(0), k.get(1), new ArrayList<>(v))));

这里假设 ReleaseTime 有一个接收所有属性的构造函数:

public ReleaseTime(Date startDate, Date endDate, List<String> regions) {
this.startDate = startDate;
this.endDate = endDate;
this.regions = regions;
}

关于java - 如何通过多个属性查找重复对象并合并它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58412139/

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