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

问题描述 投票:1回答:2

任何想法如何对2d字符串数组执行修剪操作,例如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();
    }
}
multidimensional-array java-8 java-stream trim
2个回答
2
投票

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

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

0
投票

请先决定是要创建具有相同尺寸的new 2D数组,还是要将修剪后的字符串存储回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()使您的数组成为列表视图。对列表所做的更改将写回到数组中,这就是我们想要的。

© www.soinside.com 2019 - 2024. All rights reserved.