Tmrmria:
私は、次の内容を持っているタイプの「詳細」からSortedListがあります:
[0]=Details test0: 28.01.2020
[0]=Details test1: 1234
[0]=Details test2: abcd
[0]=Details test3: 1
[0]=Details test4: 20.6
[0]=Details test5: 20.20
[1]=Details test0: 28.01.2020
[1]=Details test1: 1234
[1]=Details test2: abcd
[1]=Details test3: 1
[1]=Details test4: 20.6
[1]=Details test5: 20.20
[2]=Details test0: 29.01.2020
[2]=Details test1: 1234
[2]=Details test2: abcd
[2]=Details test3: 1
[2]=Details test4: 20.7
[2]=Details test5: 20.20
今、ソートされたリストは、すべてのオブジェクトにこれを返しますが、私は同じTEST0、TEST1、TEST2と和TEST3、TEST4とTEST5(TEST3 + TEST3、TEST4 + TEST4とTEST5 + TEST5)ですべてを合計するとします。
[0]=Details test0: 28.01.2020
[0]=Details test1: 1234
[0]=Details test2: abcd
[0]=Details test3: 2
[0]=Details test4: 41.2
[0]=Details test2: 40.40
[1]=Details test0: 29.01.2020
[1]=Details test1: 1234
[1]=Details test2: abcd
[1]=Details test3: 1
[1]=Details test4: 2.7
[1]=Details test5: 20.20
私はかどうかわからないんだけどlist.stream().filter
、この問題に対する最善の選択肢です。何か案は?すべてTEST0の重複を見つける必要がある二つの方法:
public static List<Detail> getDuplicates(final List<Detail> list) {
return getDuplicatesMap(list).values()
.stream()
.filter(duplicates -> duplicates.size() > 1)
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
private static Map<String, List<Details>> getDuplicatesMap(List<Details> list) {
return list.stream().collect(Collectors.groupingBy(Details::test0));
}
また:
あなたは、いくつかの属性に基づいて重複したエントリをマージし、ちょうど重複を識別されていません探しています。使用Collectors.toMap
では、mergeFunction
あなたがこれを解決するのに役立つはずです。
public static List<Details> getDuplicates(final List<Details> list) {
return new ArrayList<>(list.stream()
.collect(Collectors.toMap(dtl ->
Arrays.asList(dtl.getTest0(), dtl.getTest1(), dtl.getTest2()),
Function.identity(), Details::mergeDuplicates))
.values());
}
マージ関数は、型特異的に使用されると仮定した場合Number
のように追加することができるのを:
static Details mergeDuplicates(Details a, Details b) {
return new Details(a.getTest0(), a.getTest1(), a.getTest2(),
a.getTest3() + b.getTest3(), a.getTest4() + b.getTest4(), a.getTest5() + b.getTest5());
}