我有一个二维数组作为输入,其中所有项目都是字符串。数据的格式为:姓名、年级。我应该编写一个方法,将此数组作为输入并返回 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/