【问题标题】:How to return String[][] after finish splitting a string twice?如何在完成两次拆分字符串后返回 String[][]?
【发布时间】:2018-01-23 12:46:54
【问题描述】:

假设我要拆分一个字符串,我想先用 char 'E' 拆分,然后再用 'space' 拆分。

String str = "30 3 3 11 5 2 2 7 9 2 1 20 E 21 2 2 11 14 5 2 1 7 3 6 E 30 4 3 11 5 21 2 15 20 3 17 9 5 1 32 E" 

第一次拆分:

String[] first= str.split("E");

第二次拆分:

for(int i=0; i<first.length; i++){
    String[] second = first[i].split(" ");
    return Second;
}

但是,这只会返回索引 0 处的字符串数组。我想返回整个数组。我尝试将变量 String[] Second 放在循环之外。它不起作用。

我希望结果相当于:

String[][] result = {
        { "30", "3", "3" "11" "5" "2" "2" "7" "9" "2" "1" "20" },
        { "21", "2", "2" "11" "14" "5" "2" "1" "7" "3" "6" },
        { "30" "4" "3" "11" "5" "21" "2" "15" "20" "3" "17" "9" "5" "1" 32", "1", "32" }
};

有什么建议吗?

【问题讨论】:

  • 您正在从 for 循环返回。这是正常行为。
  • return 语句在第一次循环迭代中启动,因此它永远不会到达下一个循环迭代。您必须先将 FirstSplit 中的所有项目拆分,然后将它们合并到一个数组中,然后将其返回到循环之外。
  • 您对此的预期输出是什么?数组还是数组?
  • FirstSplit 包含什么?你能提供一个MCVE吗?在第一次迭代中已经离开了 for 循环。
  • @johnll 我期待数组,先生

标签: java string split


【解决方案1】:

如果要将字符串拆分成字符串数组,那么:

 String[] first= str.split("E");
 String[][] second = new String[first.length][];
 for (int i = 0; i < second.length; i++) {
     second[i] = first[i].split(" ");
 }

【讨论】:

  • 漂亮而简单。很好地发现OP希望结果​​为String [] []。我编辑了问题来解释这一点。
【解决方案2】:

如果您使用的是 Java 8,则可以使用:

String[][] result = Stream.of(str.split("E"))
        .map(firstSpring -> firstSpring.trim().split("\\s+"))
        .toArray(String[][]::new);

打印结果:

System.out.println(Arrays.deepToString(result));

注意:我使用trim() + split("\\s+") 来避免结果中出现空格。

【讨论】:

  • 理想情况下,当您知道您有一个数组时,您应该使用Arrays.stream 而不是Stream.of,因为此方法旨在累积传递给它的值,例如Stream.of("1","2","3","4","5") 等。另外,养成使用Arrays.stream 的习惯将有助于防止Stream.of 返回意外结果的情况。
  • 谢谢@Aominè 我会记住这一点,下次+1 为您的回答以及
【解决方案3】:

没有必要“将字符串拆分两次”(如果不合并两个数组,您实际上无法做到这一点,因为拆分字符串无论如何都会返回一个数组)。

Java 的String.split 方法不是按字符拆分,而是按regex。这意味着您可以简单地告诉 java 立即按字符“E”和“”(空格)进行拆分。

String[] First= str.split("E| ");

该 |正则表达式中的运算符是“或”运算符。它会在字符串中查找匹配 'E' 或 ' ' 的任何位置。

【讨论】:

  • 该正则表达式在输入字符串的中间为 E 留下了两个空字符串。
【解决方案4】:

如果您只需要一个 String[],一个非常简单的方法是在用空格分割之前删除 Es(避免复杂的正则表达式):

String input = "E 30 3 20 E 21 2 1 32 E 5 E";
input = input.replace("E ", ""); // remove leading E
input = input.replace(" E", ""); // remove trailing E
input = input.replace(" E ", " "); // remove remaining Es
System.out.println(input); // 30 3 20 21 2 1 32 5

String[] result = input.split(" ");
System.out.println(Arrays.toString(result)); // [30, 3, 20, 21, 2, 1, 32, 5]

【讨论】:

  • (如果这是 OP 的问题,那么 String[] First= str.split("(E| )+"); 是一种更简单的方法。但我不认为这是 OP 的问题。)
  • @StephenC 如果输入以 E 开头,这将留下一个空结果。RegExp 很快变得复杂,所以我放弃了它。但是,嘿,OP 找到了答案!
【解决方案5】:

YCF_L's 答案的另一个变体是使用Pattern API。

String[][] resultSet =
                Pattern.compile("E")
                .splitAsStream(str)
                .map(e -> e.trim().split(" "))
                .toArray(String[][]::new);

【讨论】:

    【解决方案6】:

    你可以像这样重复两次。

    public class Solution {
        public static void main(String[] args) {
            String Str = "30 3 3 11 5 2 2 7 9 2 1 20 E 21 2 2 11 14 5 2 1 7 3 
            6 E 30 4 3 11 5 21 2 15 20 3 17 9 5 1 32 E" ;
            String first[] =Str.split("E");
            String second[][]=convert(first);
            for(int i=0;i<second.length;i++){
                for(int j=0;j<second[i].length;j++){
                    System.out.print(second[i][j]+ " ");
                }
                System.out.println("");
            }
        }
        public static String[][] convert(String[] first){
            String second[][] = new String[first.length][];
            for(int i = 0;i<first.length;i++){
                second[i] = first[i].split(" ");
            }
            return second;
        }
    }
    

    输出:-

    30 3 3 11 5 2 2 7 9 2 1 20 
     21 2 2 11 14 5 2 1 7 3 6 
     30 4 3 11 5 21 2 15 20 3 17 9 5 1 32 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多