複数のプロパティで重複したオブジェクトを検索し、それらをマージするには?

ハイグエン:

以下のよう:オブジェクトを持っている私はMongoDBのIでのコレクションの間のデータの正規化のための検証機能を書いています:

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

私は、同じ持っているすべてのReleaseTimeオブジェクトを収集する必要がありstartDate、同じことがendDate、その後一緒に地域のリストをマージ

私はた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()));

私が使用していることに注意LinkedHashMapしてLinkedHashSet挿入順序で要素を維持します。


EDIT:

あなたが必要な場合はReleaseTime、オブジェクトの代わりに、唯一の彼らの領域を、1つの余分なステップでそれを実現できます。

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;
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=312792&siteId=1