Попробуйте это. Я поместил данные в массив для демонстрации.
String[] vals = {
"Group: A ",
"12 ",
"27 ",
"14 ",
"Group: B ",
"68 ",
"10 ",
"42 ",
"79 ",
"Group: D ",
"10 ",
"20 ",
"30 ",
"18 ",
"12 "
};
Группировать данные на карте было простым захватом тега Group
, а затем добавить значения к значению List
для этого тега. , Данные обрезаются из пробелов перед обработкой, а соответствующие строки преобразуются в целые числа. Из-за асинхронного характера данных я не мог придумать более краткий способ сделать это. У других могут быть лучшие идеи.
Map<String, List<Integer>> map = new HashMap<>();
List<Integer> numbs = null;
for (String v : vals) {
v = v.trim();
if (v.startsWith("Group")) {
// add a new List and save its reference
map.put(v, numbs = new ArrayList<>());
} else {
// add using current object
numbs.add(Integer.valueOf(v));
}
}
На втором шаге я только что создал карту сводной статистики, набранную с идентификатором группы.
Map<String, IntSummaryStatistics> results =
map.entrySet()
// stream of entryset
.stream()
// put them in a map
.collect(Collectors
.toMap(
e -> e.getKey(),
// generate summary stats for each list by
// streaming the list and collecting the values
e -> e.getValue()
.stream()
.collect(Collectors.summarizingInt(r->r))));
results.entrySet().forEach(System.out::println);
Печать
Group: A=IntSummaryStatistics{count=3, sum=53, min=12, average=17.666667, max=27}
Group: B=IntSummaryStatistics{count=4, sum=199, min=10, average=49.750000, max=79}
Group: D=IntSummaryStatistics{count=5, sum=90, min=10, average=18.000000, max=30}