【问题标题】:java double split to String[ ][ ]java双重拆分为String[][]
【发布时间】:2020-02-24 11:37:17
【问题描述】:

我想出一种方法来获取一个字符串并使用.split() 两次来创建一个嵌套数组时遇到了问题。

例如,如果我有字符串1|2|3#1|2,然后我使用split("#"),我最终会得到:[ "1|2|3" , "1|2" ]

然后我想以某种方式 .split("|") 内部字符串,所以我最终得到:[ [1,2,3] , [1,2] ]

但它必须是String[][]

我已经尝试使用 ArrayList 作为外部数组,所以我有一个 ArrayList,然后使用 .add() 将其与每个内部数组一起构建。

但后来我不知道如何将其转换为String[][]

我可能遗漏了一些明显的东西,但我已经尝试了大约一个小时并且没有运气。

【问题讨论】:

    标签: java arrays string split


    【解决方案1】:

    你在正确的轨道上。在第一个 split 之后获得 String[] 后,分配您的 String[][] 然后将其填充到循环中,拆分第一个数组中的字符串:

    String str = "1|2|3#1|2";
    String[] strs = str.split("#");
    String[][] result = new String[strs.length][];
    for (int i = 0; i < strs.length; ++i) {
        result[i] = strs[i].split("\\|");
    }
    

    Live Example

    请注意,由于split 接受定义正则表达式的字符串,因此您必须将其中的| 转义(因为| 在正则表达式中具有特殊含义)。你用反斜杠转义正则表达式中的东西。由于我使用字符串文字来编写正则表达式,因此要在字符串中实际放置反斜杠,我必须将其转义(使用另一个反斜杠)。

    或者使用流(感谢ChenZhou 指出了那里 80% 的路),感谢the JavaDoc 完成剩下的路:

    String[] strs = "1|2|3#1|2".split("#");
    String[][] result = Stream.of(strs).map(e -> e.split("\\|")).toArray(String[][]::new);
    

    Live Example

    【讨论】:

    • 为什么“\\|”中有一个\\
    • @Aspwilenson - 点击刷新,我一开始忘了解释,但我几乎立即意识到并在解释中进行了编辑。
    • 这是我尝试的第一件事,但我不知道 \\ 并放弃了它。谢谢
    • @Aspwilenson - 这是一个常见的“陷阱”,每个人都必须首先学习。 :-)
    【解决方案2】:
    String[] array = "1|2|3#1|2".split("#");
    String[][] objects = Stream.of(array).map(e -> e.split("\\|"))
        .toArray(String[][]::new);
    
    System.out.println(Arrays.deepToString(objects));
    

    输出:

    [[1, 2, 3], [1, 2]] 
    

    【讨论】:

    • 生成Object[],而不是String[][]
    • .toArray(String[][]::new) 完成了剩下的工作。
    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 2010-11-23
    • 2019-08-08
    • 2016-07-22
    • 2019-09-19
    • 1970-01-01
    • 2012-10-17
    • 2017-02-19
    相关资源
    最近更新 更多