java - 如何使用给定的 String[][] 和预期的 String[][] 返回来计算平均成绩

标签 java arrays java-stream

我有一个二维数组作为输入,其中所有项目都是字符串。数据的格式为:姓名、年级。我应该编写一个方法,将此数组作为输入并返回 String[][] 显示不同的名称和平均成绩。所有这些都使用流。

{"Ann", "5"},
{"Tom", "6"},
{"Kate", "3"},
{"Albert", "2"},
{"Ann", "3"},
{"Tom", "1"},
{"Tom", "4"},
{"John", "2"}

到目前为止我所实现的是打印此输出:

Ann=4.0
Tom=3.6666666666666665
Kate=3.0
John=2.0
Albert=2.0

使用此代码:

Arrays.stream(input)
        .collect(Collectors.groupingBy(a -> a[0], Collectors.averagingDouble(a -> Double.parseDouble(a[1]))))
        .entrySet().forEach(System.out::println);

(我使用 system.out 只是为了检查输出,因为我被卡住了。)

输出需要按名称排序,成绩使用 DecimalFormat 格式化为小数点后两位。如果传递空输入,则应返回空数组(我想这可能是有关使用选项的提示)。

我寻找不同的解决方案来给我提供线索,但我完全陷入困境。我什至不确定我的输出是否是二维数组。而且它绝对没有排序或格式化。任何帮助表示赞赏。

最佳答案

收集到Map后,您可以通过按名称排序将每个条目流式传输并转换为String[]数组,然后使用toArray进行转换进入二维数组

String[][] output = Arrays.stream(input)
            .collect(Collectors.groupingBy(a -> a[0], Collectors.averagingDouble(a -> Double.parseDouble(a[1]))))
            .entrySet()
            .stream()
            .sorted(Map.Entry.comparingByKey())
            .map(ar -> new String[] { ar.getKey(), String.format( "%.2f", ar.getValue()) })
            .toArray(String[][]::new);

    System.out.println(Arrays.deepToString(output));  //[[Ann, 5.00], [Tom, 3.50]]

如果输入数组可以为空,那么您必须在使用三元运算符流式传输数组之前进行检查

input = Objects.nonNull(input) ? input : new String[][] {{}};

您还可以使用过滤器检查内部数组对象

Arrays.stream(input)
            .filter(inArray->Objects.nonNull(inArray) && inArray.length==2)
            .collect(Collectors.groupingBy(a -> a[0], Collectors.averagingDouble(a -> Double.parseDouble(a[1]))))

关于java - 如何使用给定的 String[][] 和预期的 String[][] 返回来计算平均成绩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59447926/

相关文章:

javascript - 如何查找数组值是否在字符串中并将其删除?

java - Java 8 流中的非干扰确切含义

java - 是否可以使用 Java 8 Streams API 进行异步处理?

java - 线程安全单例类

java - Android - 像 Chrome 一样实现下拉刷新

java - Eclipse/PyCharm 中的 jython 设置

java-8 - Java 流 : get max if no duplicates

java - 如何使用 DOM 转义特殊字符

c - 为什么 "unused attribute"为结构数组生成警告?

arrays - 非连续元素的最大总和(来自任意位置的 k 个元素)