java – 拆分字符串后,数组中的第一个元素是什么?

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

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处没有任何内容,甚至没有空格,但仍然增加了我的数组的大小。 任何人都可以解释为什么会这样吗?

考虑拆分表达式",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("(?!(^|$))"); 

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

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

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

你也可以尝试这种方式

 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 

按照