11

我试图将字符串拆分为单个字母的数组。这就是我所做的,

String str = "abcddadfad"; 
System.out.println(str.length());    //  output: 10  
String[] strArr = str.split("");  
System.out.println(strArr.length);   //  output: 11   
System.out.println(strArr[0]);       // output is nothing 

新数组确实包含所有字母,但是它在索引 0 处没有任何内容,甚至没有空格,但仍然增加了我的数组的大小。谁能解释为什么会这样?

4

4 回答 4

14

考虑拆分表达式",1,2,3,4".split(",");

你会期待什么?对,一个空字符串开始。在您的情况下,您在第一个“a”前面和后面都有一个“无”。

更新:评论表明这个解释还不够解释(它可能不是)......但是,它真的很简单:引擎从字符串的开头开始,它查看前面是否有什么它匹配模式。如果是这样,它会将其背后的内容分配给拆分中的新项目。

在第一个字符上,它有“”(后面什么都没有),它会查看它前面是否有“”(模式)。有,所以它创建了一个 "" 匹配。

然后它继续前进,它的后面有一个“a”,它的前面又是一个“”。所以第二个结果是一个“a”字符串。

一个有趣的观察是,如果你使用split("", -1)你也会在结果数组的最后一个位置得到一个空字符串结果。


编辑2:如果我进一步绞尽脑汁,并认为这是一项学术练习(我在现实生活中不建议这样做......)我只能想到一种split()将字符串的正则表达式转换为String[]数组的好方法每个字符串中的 1 个字符(与 char[] 相反——其他人已经给出了很好的答案......)。

String[] chars = str.split("(?<=.)", str.length());

这将查看每个字符的后面,在一个非捕获组中,并在其上拆分,然后将数组大小限制为字符数(您可以str.length()省略,但如果放置-1,最后会得到一个额外的空间)

借用 nitro2k01 的替代方案(在评论下方)引用字符串的开头和结尾,您可以可靠地拆分:

String[] chars = str.split("(?!(^|$))");
于 2013-11-15T04:16:35.197 回答
2

您可以只使用字符串类中的内置 java 方法。myString.toCharArray()空字符串存储在索引 0

于 2013-11-15T04:16:07.583 回答
0

你也可以试试这种方式

String str = "abcddadfad";
System.out.println(str.length());  // output: 10
String[] strArr = new String[str.length()];
for (int i = 0; i < strArr.length; i++) {   

strArr[i] = "" + str.charAt(i);

    // As per  ratchet freak comment: it's easier (and more efficient) to use 
     strArr[i] = substring(i,i+1);
}
System.out.println(strArr.length); // output: 10
System.out.println(strArr[0]);     // output: a

按照

于 2013-11-15T04:23:41.517 回答
0

我必须阅读代码,才能准确理解 "" 作为正则表达式的工作原理。但是,请记住它匹配空字符串......并且参数是正则表达式,并且 javadoc 提到调用 split(regex) 与调用 split(regex,0) 相同。因此,如果剩余的字符串都是空格(或空字符串),它将不会再次尝试匹配,这就是它与最后一个字符之后的最终空字符串不匹配的原因。

更好的调用函数可能是str.toCharArray();

于 2013-11-15T04:21:20.433 回答