/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
List
<Exon
> listExon
= new ArrayList
<>(List.
of( new Exon(1L, new IncomeCode("45"), LocalDate.of(2021, 1, 1), "4"),
new Exon(2L, new IncomeCode("21"), LocalDate.of(2022, 1, 1), "5"),
new Exon(3L, new IncomeCode("33"), LocalDate.of(2023, 1, 1), "2"),
new Exon(4L, new IncomeCode("45"), LocalDate.of(2021, 1, 1), "4")
));
List
<Sup
> listSup
= new ArrayList
<>(List.
of( new Sup(1L, new IncomeCode("45"), null, LocalDate.of(2021, 1, 1), "4"),
new Sup(2L, new IncomeCode("21"), null, LocalDate.of(2022, 1, 1), "5"),
new Sup(3L, new IncomeCode("33"), null, LocalDate.of(2023, 1, 1), "2")
));
List<List<Object>> listRes = new ArrayList<>(Stream.concat(listExon.stream(), listSup.stream())
.collect(Collectors.groupingBy(obj -> {
if (obj instanceof Exon) {
Exon exon = (Exon) obj;
return String.
format("%s-%s-%s", exon.
getIncomeCode(), exon.
getEndDate(), exon.
getCodeRef()); }
Sup sup = (Sup) obj;
return String.
format("%s-%s-%s", sup.
getIncomeCode(), sup.
getEndDate(), sup.
getCodeRef()); })).values());
for(List<Object> l: listRes){
}
}
static class Exon {
private IncomeCode incomeCode;
private LocalDate endDate;
public Exon
(Long id, IncomeCode incomeCode, LocalDate endDate,
String codeRef
) { this.id = id;
this.incomeCode = incomeCode;
this.endDate = endDate;
this.codeRef = codeRef;
}
return id;
}
public IncomeCode getIncomeCode() {
return incomeCode;
}
public LocalDate getEndDate() {
return endDate;
}
return codeRef;
}
@Override
return String.
format("%s{%s %s %s}", getClass
().
getSimpleName(), incomeCode, endDate, codeRef
); }
}
static class Sup {
private IncomeCode incomeCode;
private LocalDate startDate;
private LocalDate endDate;
public Sup
(Long id, IncomeCode incomeCode, LocalDate startDate, LocalDate endDate,
String codeRef
) { this.id = id;
this.incomeCode = incomeCode;
this.startDate = startDate;
this.endDate = endDate;
this.codeRef = codeRef;
}
return id;
}
public IncomeCode getIncomeCode() {
return incomeCode;
}
public LocalDate getStartDate() {
return startDate;
}
public LocalDate getEndDate() {
return endDate;
}
return codeRef;
}
@Override
return String.
format("%s{%s %s %s}", getClass
().
getSimpleName(), incomeCode, endDate, codeRef
); }
}
static class IncomeCode {
public IncomeCode
(String code
) { this.code = code;
}
return code;
}
@Override
return code;
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCUxpc3Q8RXhvbj4gbGlzdEV4b24gPSBuZXcgQXJyYXlMaXN0PD4oTGlzdC5vZigKICAgICAgICAgICAgICAgIG5ldyBFeG9uKDFMLCBuZXcgSW5jb21lQ29kZSgiNDUiKSwgTG9jYWxEYXRlLm9mKDIwMjEsIDEsIDEpLCAiNCIpLAogICAgICAgICAgICAgICAgbmV3IEV4b24oMkwsIG5ldyBJbmNvbWVDb2RlKCIyMSIpLCBMb2NhbERhdGUub2YoMjAyMiwgMSwgMSksICI1IiksCiAgICAgICAgICAgICAgICBuZXcgRXhvbigzTCwgbmV3IEluY29tZUNvZGUoIjMzIiksIExvY2FsRGF0ZS5vZigyMDIzLCAxLCAxKSwgIjIiKSwKICAgICAgICAgICAgICAgIG5ldyBFeG9uKDRMLCBuZXcgSW5jb21lQ29kZSgiNDUiKSwgTG9jYWxEYXRlLm9mKDIwMjEsIDEsIDEpLCAiNCIpCiAgICAgICAgKSk7CgogICAgICAgIExpc3Q8U3VwPiBsaXN0U3VwID0gbmV3IEFycmF5TGlzdDw+KExpc3Qub2YoCiAgICAgICAgICAgICAgICBuZXcgU3VwKDFMLCBuZXcgSW5jb21lQ29kZSgiNDUiKSwgbnVsbCwgTG9jYWxEYXRlLm9mKDIwMjEsIDEsIDEpLCAiNCIpLAogICAgICAgICAgICAgICAgbmV3IFN1cCgyTCwgbmV3IEluY29tZUNvZGUoIjIxIiksIG51bGwsIExvY2FsRGF0ZS5vZigyMDIyLCAxLCAxKSwgIjUiKSwKICAgICAgICAgICAgICAgIG5ldyBTdXAoM0wsIG5ldyBJbmNvbWVDb2RlKCIzMyIpLCBudWxsLCBMb2NhbERhdGUub2YoMjAyMywgMSwgMSksICIyIikKICAgICAgICApKTsKCiAgICAgICAgTGlzdDxMaXN0PE9iamVjdD4+IGxpc3RSZXMgPSBuZXcgQXJyYXlMaXN0PD4oU3RyZWFtLmNvbmNhdChsaXN0RXhvbi5zdHJlYW0oKSwgbGlzdFN1cC5zdHJlYW0oKSkKICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShvYmogLT4gewogICAgICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFeG9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEV4b24gZXhvbiA9IChFeG9uKSBvYmo7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy0lcy0lcyIsIGV4b24uZ2V0SW5jb21lQ29kZSgpLCBleG9uLmdldEVuZERhdGUoKSwgZXhvbi5nZXRDb2RlUmVmKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBTdXAgc3VwID0gKFN1cCkgb2JqOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy0lcy0lcyIsIHN1cC5nZXRJbmNvbWVDb2RlKCksIHN1cC5nZXRFbmREYXRlKCksIHN1cC5nZXRDb2RlUmVmKCkpOwogICAgICAgICAgICAgICAgfSkpLnZhbHVlcygpKTsKCiAgICAgICAgZm9yKExpc3Q8T2JqZWN0PiBsOiBsaXN0UmVzKXsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGwpOwogICAgICAgIH0KCX0KCQoJc3RhdGljIGNsYXNzIEV4b24gIHsKICAgICAgICBwcml2YXRlIExvbmcgaWQ7CiAgICAgICAgcHJpdmF0ZSBJbmNvbWVDb2RlIGluY29tZUNvZGU7CiAgICAgICAgcHJpdmF0ZSBMb2NhbERhdGUgZW5kRGF0ZTsKICAgICAgICBTdHJpbmcgY29kZVJlZjsKCiAgICAgICAgcHVibGljIEV4b24oTG9uZyBpZCwgSW5jb21lQ29kZSBpbmNvbWVDb2RlLCBMb2NhbERhdGUgZW5kRGF0ZSwgU3RyaW5nIGNvZGVSZWYpIHsKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmluY29tZUNvZGUgPSBpbmNvbWVDb2RlOwogICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBlbmREYXRlOwogICAgICAgICAgICB0aGlzLmNvZGVSZWYgPSBjb2RlUmVmOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExvbmcgZ2V0SWQoKSB7CiAgICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBJbmNvbWVDb2RlIGdldEluY29tZUNvZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBpbmNvbWVDb2RlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExvY2FsRGF0ZSBnZXRFbmREYXRlKCkgewogICAgICAgICAgICByZXR1cm4gZW5kRGF0ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29kZVJlZigpIHsKICAgICAgICAgICAgcmV0dXJuIGNvZGVSZWY7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXN7JXMgJXMgJXN9IiwgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIGluY29tZUNvZGUsIGVuZERhdGUsIGNvZGVSZWYpOwogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgU3VwIHsKICAgICAgICBwcml2YXRlIExvbmcgaWQ7CiAgICAgICAgcHJpdmF0ZSBJbmNvbWVDb2RlIGluY29tZUNvZGU7CiAgICAgICAgcHJpdmF0ZSBMb2NhbERhdGUgc3RhcnREYXRlOwogICAgICAgIHByaXZhdGUgTG9jYWxEYXRlIGVuZERhdGU7CiAgICAgICAgU3RyaW5nIGNvZGVSZWY7CgogICAgICAgIHB1YmxpYyBTdXAoTG9uZyBpZCwgSW5jb21lQ29kZSBpbmNvbWVDb2RlLCBMb2NhbERhdGUgc3RhcnREYXRlLCBMb2NhbERhdGUgZW5kRGF0ZSwgU3RyaW5nIGNvZGVSZWYpIHsKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmluY29tZUNvZGUgPSBpbmNvbWVDb2RlOwogICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKICAgICAgICAgICAgdGhpcy5lbmREYXRlID0gZW5kRGF0ZTsKICAgICAgICAgICAgdGhpcy5jb2RlUmVmID0gY29kZVJlZjsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBMb25nIGdldElkKCkgewogICAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgSW5jb21lQ29kZSBnZXRJbmNvbWVDb2RlKCkgewogICAgICAgICAgICByZXR1cm4gaW5jb21lQ29kZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBMb2NhbERhdGUgZ2V0U3RhcnREYXRlKCkgewogICAgICAgICAgICByZXR1cm4gc3RhcnREYXRlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExvY2FsRGF0ZSBnZXRFbmREYXRlKCkgewogICAgICAgICAgICByZXR1cm4gZW5kRGF0ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29kZVJlZigpIHsKICAgICAgICAgICAgcmV0dXJuIGNvZGVSZWY7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXN7JXMgJXMgJXN9IiwgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIGluY29tZUNvZGUsIGVuZERhdGUsIGNvZGVSZWYpOwogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgSW5jb21lQ29kZSB7CiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29kZTsKCiAgICAgICAgcHVibGljIEluY29tZUNvZGUoU3RyaW5nIGNvZGUpIHsKICAgICAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29kZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gY29kZTsKICAgICAgICB9CiAgICB9Cn0=