import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Ideone {
static class Stats {
final int data, num;
public Stats() {
data = num = 0;
}
public Stats(int data, int num) {
this.data = data;
this.num = num;
}
public Stats merge(Stats stats) {
return new Stats(this.data+stats.data, this.num+stats.num);
}
public int getData(){
return data;
}
public int getNum(){
return num;
}
@Override
return "{" + data + "," + num + "}";
}
}
public static void main
(String[] args
) { Stream<String> lines = Stream.of("item1,16,2",
"item2,17,3",
"item1,16,5"); // sample input
Map
<String, Stats
> map
= lines.
map(s
-> s.
split(",")).
collect( Collectors.groupingBy(a -> a[0],
Collectors.
mapping(a
-> new Stats
(Integer.
parseInt(a
[1]),
Integer.
parseInt(a
[2])),
Collectors.reducing(new Stats(), Stats::merge))));
}
}
aW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKCmNsYXNzIElkZW9uZSB7CgkKCXN0YXRpYyBjbGFzcyBTdGF0cyB7CgkgICAgZmluYWwgaW50IGRhdGEsIG51bTsKCSAgICAKCSAgICBwdWJsaWMgU3RhdHMoKSB7CgkgICAgCWRhdGEgPSBudW0gPSAwOwoJICAgIH0KCSAgICAKCSAgICBwdWJsaWMgU3RhdHMoaW50IGRhdGEsIGludCBudW0pIHsKCSAgICAJdGhpcy5kYXRhID0gZGF0YTsKCSAgICAJdGhpcy5udW0gPSBudW07CgkJfQoJCgkgICAgcHVibGljIFN0YXRzIG1lcmdlKFN0YXRzIHN0YXRzKSB7CgkgICAgCXJldHVybiBuZXcgU3RhdHModGhpcy5kYXRhK3N0YXRzLmRhdGEsIHRoaXMubnVtK3N0YXRzLm51bSk7CgkgICAgfQoJCgkgICAgcHVibGljIGludCBnZXREYXRhKCl7CgkgICAgICAgIHJldHVybiBkYXRhOwoJICAgIH0KCSAgICBwdWJsaWMgaW50IGdldE51bSgpewoJICAgICAgICByZXR1cm4gbnVtOwoJICAgIH0KCSAgICAKCSAgICBAT3ZlcnJpZGUKCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCQlyZXR1cm4gInsiICsgZGF0YSArICIsIiArIG51bSArICJ9IjsKCSAgICB9Cgl9CgoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoJCVN0cmVhbTxTdHJpbmc+IGxpbmVzID0gU3RyZWFtLm9mKCJpdGVtMSwxNiwyIiwKCQkJICAgICAgIml0ZW0yLDE3LDMiLAoJCQkgICAgICAiaXRlbTEsMTYsNSIpOyAvLyBzYW1wbGUgaW5wdXQKCQkKCQlNYXA8U3RyaW5nLCBTdGF0cz4gbWFwID0gbGluZXMubWFwKHMgLT4gcy5zcGxpdCgiLCIpKS5jb2xsZWN0KAoJCQkJQ29sbGVjdG9ycy5ncm91cGluZ0J5KGEgLT4gYVswXSwgCgkJCQkJCUNvbGxlY3RvcnMubWFwcGluZyhhIC0+IG5ldyBTdGF0cyhJbnRlZ2VyLnBhcnNlSW50KGFbMV0pLCBJbnRlZ2VyLnBhcnNlSW50KGFbMl0pKSwgCgkJCQkJCQkJQ29sbGVjdG9ycy5yZWR1Y2luZyhuZXcgU3RhdHMoKSwgU3RhdHM6Om1lcmdlKSkpKTsKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4obWFwKTsKCX0KCn0K