二维数组的流操作

Ami*_*mit 5 java lambda multidimensional-array java-8 java-stream

我试图从二维数组下面找到最佳平均分数:

String[][] scores = { { "Amit", "70" }, { "Arthit", "60" }, { "Peter", "60" }, { "Arthit", "100" } };
Run Code Online (Sandbox Code Playgroud)

输出为: 80(Arthit得分(60 + 100)/ 2)

直到现在我用下面的方法解决了这个问题,但是我正在寻找带流的优雅解决方案:

public static void main(String[] args) {
        String[][] scores = { { "Amit", "70" }, { "Arthit", "60" }, { "Peter", "60" }, { "Arthit", "100" } };

        int highestAvg = Integer.MIN_VALUE;
        Function<String[], Integer> function = new Function<String[], Integer>() {
            @Override
            public Integer apply(String[] t) {
                int sum = 0, count = 0;
                for (int i = 0; i < scores.length; i++) {
                    if (t[0].equals(scores[i][0])) {
                        count++;
                        sum += Integer.parseInt(scores[i][1]);
                    }
                }
                int avg = sum / count;
                return highestAvg < avg ? avg : highestAvg;
            }
        };
        System.out.println(Arrays.stream(scores).map(function).max((o1, o2) -> o1.compareTo(o2)).get());
    }
Run Code Online (Sandbox Code Playgroud)

您能否建议,使用流处理二维数组的更好方法是什么?

注意:我不是在寻找确切的解决方案,只是看看你宝贵的建议.

ern*_*t_k 9

您可以更多地使用内置流功能,包括平均分组收集器:

Stream.of(scores)
        .collect(
                Collectors.groupingBy(a -> a[0], 
                Collectors.averagingInt(a -> Integer.parseInt(a[1]))))
        .entrySet()
        .stream()
        .max(Entry.comparingByValue())
        .ifPresent(bestScore -> {
                String message = String.format("Best score is %s, by %s", bestScore.getValue(), bestScore.getKey());
                System.out.println(message);
        });
Run Code Online (Sandbox Code Playgroud)

哪个打印 Best score is 80.0, by Arthit