/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.stream.*;
import java.util.List;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
List
<Map
<String, Map
<String, Genuineness
>>> taskHandles
= new ArrayList
<>(); Map
<String, Map
<String, Genuineness
>> map1
= new HashMap
<>(); Map
<String, Genuineness
> map1Sub
= new HashMap
<>(); map1Sub.put("APP_1", new Genuineness(1, 1,1));
map1.put("USER_1", map1Sub);
taskHandles.add(map1);
Map
<String, Map
<String, Genuineness
>> map2
= new HashMap
<>(); Map
<String, Genuineness
> map2Sub
= new HashMap
<>(); map2Sub.put("APP_1", new Genuineness(1, 1,1));
map2Sub.put("APP_2", new Genuineness(2, 2,2));
map2.put("USER_2", map2Sub);
taskHandles.add(map2);
Map
<String, Map
<String, Genuineness
>> map3
= new HashMap
<>(); Map
<String, Genuineness
> map3Sub
= new HashMap
<>(); map3Sub.put("APP_1", new Genuineness(1, 1,1));
map3.put("USER_1", map3Sub);
taskHandles.add(map3);
Map
<String, Map
<String, Genuineness
>> map4
= new HashMap
<>(); Map
<String, Genuineness
> map4Sub
= new HashMap
<>(); map4Sub.put("APP_1", new Genuineness(1, 1,1));
map4Sub.put("APP_2", new Genuineness(2, 2,2));
map4.put("USER_2", map4Sub);
taskHandles.add(map4);
final Map
<String, Map
<String, Genuineness
>> map
= taskHandles.
stream() .flatMap(m -> m.entrySet().stream()).collect(
Collectors.
toMap(Map.Entry::getKey, e
-> e.
getValue().
entrySet().
stream() .collect(
g -> new Genuineness(g.getValue().getTotal(), g.getValue().getTotalGenuine(), g.getValue().getTotalDevelopment()),
(g1, g2) -> new Genuineness(g1.getTotal() + g2.getTotal(),
g1.getTotalGenuine() + g2.getTotalGenuine(),
g1.getTotalDevelopment() + g2.getTotalGenuine()
)
)
),(l, r) -> {
l.forEach((k, v) -> r.merge(k, v,
(bi, bii) -> new Genuineness(bi.getTotal() + bii.getTotal(),
bi.getTotalGenuine() + bii.getTotalGenuine(),
bi.getTotalDevelopment() + bii.getTotalGenuine())));
return r;
}
)
);
}
}
class Genuineness {
public Genuineness(int total, int totalGenuine, int totalDevelopment) {
this.total = total;
this.totalGenuine = totalGenuine;
this.totalDevelopment = totalDevelopment;
}
int total;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getTotalGenuine() {
return totalGenuine;
}
public void setTotalGenuine(int totalGenuine) {
this.totalGenuine = totalGenuine;
}
public int getTotalDevelopment() {
return totalDevelopment;
}
public void setTotalDevelopment(int totalDevelopment) {
this.totalDevelopment = totalDevelopment;
}
int totalGenuine;
@Override
return "Genuineness{" +
"total=" + total +
", totalGenuine=" + totalGenuine +
", totalDevelopment=" + totalDevelopment +
'}';
}
int totalDevelopment;
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLio7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUKewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CglMaXN0PE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEdlbnVpbmVuZXNzPj4+IHRhc2tIYW5kbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgR2VudWluZW5lc3M+PiBtYXAxID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIE1hcDxTdHJpbmcsIEdlbnVpbmVuZXNzPiBtYXAxU3ViID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIG1hcDFTdWIucHV0KCJBUFBfMSIsIG5ldyBHZW51aW5lbmVzcygxLCAxLDEpKTsKICAgICAgICBtYXAxLnB1dCgiVVNFUl8xIiwgbWFwMVN1Yik7CiAgICAgIHRhc2tIYW5kbGVzLmFkZChtYXAxKTsKCgoKICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBHZW51aW5lbmVzcz4+IG1hcDIgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgTWFwPFN0cmluZywgR2VudWluZW5lc3M+IG1hcDJTdWIgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgbWFwMlN1Yi5wdXQoIkFQUF8xIiwgbmV3IEdlbnVpbmVuZXNzKDEsIDEsMSkpOwogICAgICAgIG1hcDJTdWIucHV0KCJBUFBfMiIsIG5ldyBHZW51aW5lbmVzcygyLCAyLDIpKTsKICAgICAgICBtYXAyLnB1dCgiVVNFUl8yIiwgbWFwMlN1Yik7CiAgICAgICAgdGFza0hhbmRsZXMuYWRkKG1hcDIpOwoKCiAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgR2VudWluZW5lc3M+PiBtYXAzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIE1hcDxTdHJpbmcsIEdlbnVpbmVuZXNzPiBtYXAzU3ViID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIG1hcDNTdWIucHV0KCJBUFBfMSIsIG5ldyBHZW51aW5lbmVzcygxLCAxLDEpKTsKCiAgICAgICAgbWFwMy5wdXQoIlVTRVJfMSIsIG1hcDNTdWIpOwogICAgICAgIHRhc2tIYW5kbGVzLmFkZChtYXAzKTsKCgogICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEdlbnVpbmVuZXNzPj4gbWFwNCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICBNYXA8U3RyaW5nLCBHZW51aW5lbmVzcz4gbWFwNFN1YiA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICBtYXA0U3ViLnB1dCgiQVBQXzEiLCBuZXcgR2VudWluZW5lc3MoMSwgMSwxKSk7CiAgICAgICAgbWFwNFN1Yi5wdXQoIkFQUF8yIiwgbmV3IEdlbnVpbmVuZXNzKDIsIDIsMikpOwogICAgICAgIG1hcDQucHV0KCJVU0VSXzIiLCBtYXA0U3ViKTsKICAgICAgICB0YXNrSGFuZGxlcy5hZGQobWFwNCk7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTWFwPFN0cmluZywgR2VudWluZW5lc3M+PiBtYXAgPSB0YXNrSGFuZGxlcy5zdHJlYW0oKQogICAgICAgICAgICAgICAgLmZsYXRNYXAobSAtPiBtLmVudHJ5U2V0KCkuc3RyZWFtKCkpLmNvbGxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3RvcnMudG9NYXAoTWFwLkVudHJ5OjpnZXRLZXksIGUgLT4gZS5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkuc3RyZWFtKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3RvcnMudG9NYXAoTWFwLkVudHJ5OjpnZXRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgLT4gbmV3IEdlbnVpbmVuZXNzKGcuZ2V0VmFsdWUoKS5nZXRUb3RhbCgpLCBnLmdldFZhbHVlKCkuZ2V0VG90YWxHZW51aW5lKCksIGcuZ2V0VmFsdWUoKS5nZXRUb3RhbERldmVsb3BtZW50KCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZzEsIGcyKSAtPiBuZXcgR2VudWluZW5lc3MoZzEuZ2V0VG90YWwoKSArIGcyLmdldFRvdGFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZzEuZ2V0VG90YWxHZW51aW5lKCkgKyBnMi5nZXRUb3RhbEdlbnVpbmUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnMS5nZXRUb3RhbERldmVsb3BtZW50KCkgKyBnMi5nZXRUb3RhbEdlbnVpbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwobCwgcikgLT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5mb3JFYWNoKChrLCB2KSAtPiByLm1lcmdlKGssIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaSwgYmlpKSAtPiBuZXcgR2VudWluZW5lc3MoYmkuZ2V0VG90YWwoKSArIGJpaS5nZXRUb3RhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpLmdldFRvdGFsR2VudWluZSgpICsgYmlpLmdldFRvdGFsR2VudWluZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpLmdldFRvdGFsRGV2ZWxvcG1lbnQoKSArIGJpaS5nZXRUb3RhbEdlbnVpbmUoKSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtYXApOwoJfQp9CgpjbGFzcyBHZW51aW5lbmVzcyB7CiAgICBwdWJsaWMgR2VudWluZW5lc3MoaW50IHRvdGFsLCBpbnQgdG90YWxHZW51aW5lLCBpbnQgdG90YWxEZXZlbG9wbWVudCkgewogICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDsKICAgICAgICB0aGlzLnRvdGFsR2VudWluZSA9IHRvdGFsR2VudWluZTsKICAgICAgICB0aGlzLnRvdGFsRGV2ZWxvcG1lbnQgPSB0b3RhbERldmVsb3BtZW50OwogICAgfQoKICAgIGludCB0b3RhbDsKCiAgICBwdWJsaWMgaW50IGdldFRvdGFsKCkgewogICAgICAgIHJldHVybiB0b3RhbDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbChpbnQgdG90YWwpIHsKICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7CiAgICB9CgogICAgcHVibGljIGludCBnZXRUb3RhbEdlbnVpbmUoKSB7CiAgICAgICAgcmV0dXJuIHRvdGFsR2VudWluZTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbEdlbnVpbmUoaW50IHRvdGFsR2VudWluZSkgewogICAgICAgIHRoaXMudG90YWxHZW51aW5lID0gdG90YWxHZW51aW5lOwogICAgfQoKICAgIHB1YmxpYyBpbnQgZ2V0VG90YWxEZXZlbG9wbWVudCgpIHsKICAgICAgICByZXR1cm4gdG90YWxEZXZlbG9wbWVudDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbERldmVsb3BtZW50KGludCB0b3RhbERldmVsb3BtZW50KSB7CiAgICAgICAgdGhpcy50b3RhbERldmVsb3BtZW50ID0gdG90YWxEZXZlbG9wbWVudDsKICAgIH0KCiAgICBpbnQgdG90YWxHZW51aW5lOwoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gIkdlbnVpbmVuZXNzeyIgKwogICAgICAgICAgICAgICAgInRvdGFsPSIgKyB0b3RhbCArCiAgICAgICAgICAgICAgICAiLCB0b3RhbEdlbnVpbmU9IiArIHRvdGFsR2VudWluZSArCiAgICAgICAgICAgICAgICAiLCB0b3RhbERldmVsb3BtZW50PSIgKyB0b3RhbERldmVsb3BtZW50ICsKICAgICAgICAgICAgICAgICd9JzsKICAgIH0KCiAgICBpbnQgdG90YWxEZXZlbG9wbWVudDsKfQ==