我需要实现这个方法:
公共收集器
它是多行字符串,包含所有结果、总值和标记的格式化表格。 您的表格格式应满足以下要求:
标题是必需的。
列宽取决于值的长度。
行按学生的姓氏排序。
列按任务名称排序。
双精度值以小数点后 2 位显示。
“Marl”列的值由平均总分定义。
注意不同列的对齐方式。
到目前为止我写了这段代码:
公共收集器
StringBuilder::new,
(sb, courseResult) -> {
Person person = courseResult.getPerson();
Map<String, Integer> taskResults = courseResult.getTaskResults();
List<String> taskNames = taskResults.keySet().stream().sorted().collect(Collectors.toList());
// Calculate the total score and average mark
int totalScore = taskResults.values().stream().reduce(0, Integer::sum);
double averageMark = (double) totalScore / taskResults.size();
// Append the formatted row to the StringBuilder
sb.append(String.format("%-16s", person.getLastName() + " " + person.getFirstName()));
for (String taskName : taskNames) {
sb.append(String.format("|%-12s", taskResults.getOrDefault(taskName, 0)));
}
sb.append(String.format("|%-10.2f|%-5s|\n", averageMark, calculateMark(averageMark)));
},
// Combiner: Combine two StringBuilders by concatenating their contents
(sb1, sb2) -> sb1.append(sb2.toString()),
// Finisher: Return the final formatted table string
StringBuilder::toString
);
}
private String calculateMark(double avg) {
return avg > 90 ? "A" :
avg >= 83 ? "B" :
avg >= 75 ? "C" :
avg >= 68 ? "D" :
avg >= 60 ? "E" : "F";
}}
如何添加带有字符串“Student”和任务名称的标题:
学生 |任务名称 1 |任务名称 2 |任务名称 3 |任务名称4 |总计 |马克
和“平均”线以下:平均 | AVR1 | AVR2 | AVR3 | avr4 | AVR| F?