【问题标题】:Working with Two dimensional arrays in Java-8 using Streams使用 Streams 在 Java-8 中处理二维数组
【发布时间】:2021-08-05 01:47:05
【问题描述】:

这是一个编码面试问题。我能够得到想要的结果并通过所有的测试用例。但是我没有通过面试。我认为这是因为我以命令式的方式进行了操作 - 多个 for 循环、多个 HashMap 等。我正在尝试使用 Streams 来实现相同的结果。问题来了:

给定一个数组 String[][] 例如:{{"Scott","85"},{"Scott","67"},{"Tiger","81"},{"Tiger"," 21"},{"Marissa","92"}},找出平均分最高的人。下面是我所能得到的代码sn-p。

public static void main(String[] args) {
    String[][] scores = {{"Tee","63"},{"Tee","75"},{"Tee","84"},{"Dee","59"},{"Dee","77"},{"Dee","66"},{"Dee","71"},{"Lee","81"},{"Lee","78"},{"Lee","58"},{"Bree","98"},{"Bree","78"}};

    List<List<String>> slist = Arrays.stream(scores)
            .map(Arrays::asList)
            .collect(Collectors.toList());
    
    slist.stream().collect(Collectors.groupingBy(l->l.get(0)));
}

我能够将 String[][] 转换为 List。我希望流式传输这个新列表,按第 0 个元素对其进行分组,然后对其求和,然后得到平均值。

【问题讨论】:

    标签: lambda java-8 stream java-stream


    【解决方案1】:

    这是一种方式。

    String[][] scores = {{"Tee","63"},{"Tee","75"},{"Tee","84"},{"Dee","59"}, 
       {"Dee","77"},{"Dee","66"},{"Dee","71"},{"Lee","81"},{"Lee","78"},{"Lee","58"}, 
       {"Bree","98"},{"Bree","78"}};
    
    • 将数组流式传输到单个数组的流中。
    • 收集到Map&lt;String, Double&gt; 以获取姓名和平均值。
    • 通过使用Collectors.groupingBy 并使用Collectors.averagingDouble 计算每个值的平均值来找到平均值。 ToDoubleFunction 告诉最后一个收集器要平均哪个值,在这种情况下,它必须对流中每个数组的第二个值进行双精度或整数解析。
    • 然后流式传输条目并使用maxBy 收集器比较 Entry values 最高。
    • 由于maxBy 返回一个可选值,因此首先检查值是否存在(源数组可能为空),然后使用get 来检索它。
    Optional<Entry<String, Double>> max = Arrays.stream(scores)
            .collect(Collectors.groupingBy(a->a[0],
                    Collectors.averagingDouble(a->Double.parseDouble(a[1]))))    
                    .entrySet()
                    .stream()
                    .collect(Collectors.maxBy(Entry.comparingByValue()));
    
    if (max.isPresent()) {
        Entry<String,Double> result = max.get();
        System.out.printf("%s has the highest average of %.2f%n",
                 result.getKey(),result.getValue());
    } else {
        System.out.println("No maximum found");
    }
    
    

    打印

    Bree has the highest average of 88.00
    
    

    请注意,我通过立即流式传输条目并找到最大平均值来做到这一点。它也可以分两个单独的步骤完成。首先计算并保存所有个体的平均值的地图。然后流式传输条目并找到最大值。

    最后,还可以在对源数组进行流式传输后立即放入一些过滤器,以检查空数组、空值等,以避免稍后在管道中引发异常。

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2017-10-28
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多