如何使用Java流API修剪2d数组中的字符串值并收集回2d数组?

时间:2019-12-23 12:02:40

标签: multidimensional-array java-8 java-stream trim

任何想法如何对字符串的二维数组执行修剪操作,例如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();
    }
}

2 个答案:

答案 0 :(得分:3)

我认为您的迭代解决方案没有任何问题。实际上,在我看来,迭代解决方案对于许多程序员而言都非常容易理解。 Streams API具有足够的通用性,几乎可以使用流执行任何计算,但这仅仅是因为您并不意味着应该这样做。但是,既然您已经问过了,这就是流对应项。

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

答案 1 :(得分:0)

请首先确定是要创建具有相同尺寸的 new 二维数组,还是要将修剪后的字符串存储回 existing 数组中。两者都是可能的,而且都不是很难做到的(当您现在如何)。

  • 您的问题听起来可能更像是您想要一个具有相同尺寸的新阵列。如果是这样,我觉得工作很合适,并推荐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));
    

    此代码段的输出为:

      

    [[单词,单词],[单词,单词],[单词,单词]]

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