【问题标题】:Stream 2d array, trim values and collect back to 2d array流式处理 2d 数组,修剪值并收集回 2d 数组
【发布时间】:2019-12-23 10:59:23
【问题描述】:

知道如何对二维字符串数组执行修剪操作,例如3x3 使用 Java 流 API 并收集一个返回到相同维度的 3x3 数组?

关键是要避免使用显式的 for 循环。

当前的解决方案是简单地执行一个 for 循环,例如:

String arr[][] = {
        {"  word  ", "  word  "},
        {"  word  ", "  word  "},
        {"  word  ", "  word  "}};

for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        arr[i][j] = arr[i][j].trim();
    }
}

这很有效,但我正在尝试想出一种方法来对流式 API 做同样的事情。

【问题讨论】:

    标签: java multidimensional-array stream


    【解决方案1】:

    请首先决定您是希望创建一个具有相同尺寸的 2D 数组,还是希望将修剪后的字符串存储回现有 数组中。两者都是可能的,而且都很难做到(当你现在怎么做的时候)。

    • 您的问题听起来更像是您想要一个具有相同尺寸的新数组。如果是这样,我发现流很适合这项工作,并推荐 Ravinfra Ranwala 的答案,这很好。
    • 问题中的代码将修剪后的字符串存储回现有数组中。如果你想要这个并且不想使用循环,我建议你也不要使用流,但是List.replaceAll​()
      String arr[][] = {
              {"  word  ", "  word  "},
              {"  word  ", "  word  "},
              {"  word  ", "  word  "}};
      
      Arrays.asList(arr).forEach(inner ->
              Arrays.asList(inner).replaceAll(String::trim));
      
      System.out.println(Arrays.deepToString(arr));
      
      这个 sn-p 的输出是:
      [[word, word], [word, word], [word, word]]
      

    Arrays.asList() 为您的阵列创建一个列表视图。对列表的更改会写回数组中,这正是我们想要的。

    【讨论】:

      【解决方案2】:

      您可以使用Arrays.stream 流式传输数组,如下所示:

      arr=Arrays.stream(arr).map(s -> Arrays.stream(s).map(a->a.trim()).toArray(String[]::new)).toArray(String[][]::new);
      

      您可以先传输第一个维度,然后再传输第二个维度。

      【讨论】:

        【解决方案3】:

        您可以使用IntStream.forEach 方法处理当前数组而不创建新数组:

        String[][] arr = {
                {"  word  ", "  word  "},
                {"  word  ", "  word  "},
                {"  word  ", "  word  "}};
        
        IntStream.range(0, arr.length)
                .forEach(i -> IntStream.range(0, arr[i].length)
                        .forEach(j -> arr[i][j] = arr[i][j].trim()));
        
        // output
        Arrays.stream(arr).map(Arrays::toString).forEach(System.out::println);
        

        输出:

        [word, word]
        [word, word]
        [word, word]
        

        【讨论】:

          猜你喜欢
          • 2023-03-20
          • 2018-08-06
          • 2021-05-02
          • 1970-01-01
          • 2014-08-31
          • 2020-09-04
          • 1970-01-01
          • 2015-08-13
          相关资源
          最近更新 更多