如何在 Java 中返回一个形成特殊可打印字符串的收集器?

问题描述 投票:0回答:0

我需要实现这个方法: 公共收集器 printableStringCollector() { 它返回一个收集器,该收集器形成一个特殊的可打印字符串,如下所述。

它是多行字符串,包含所有结果、总值和标记的格式化表格。 您的表格格式应满足以下要求:

标题是必需的。
列宽取决于值的长度。
行按学生的姓氏排序。
列按任务名称排序。
双精度值以小数点后 2 位显示。
“Marl”列的值由平均总分定义。
注意不同列的对齐方式。

到目前为止我写了这段代码:

公共收集器 printableStringCollector() { 返回 Collector.of(

            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?

java stream
© www.soinside.com 2019 - 2024. All rights reserved.