2013-11-15 31 views
11

我试图将一个字符串拆分为单个字母数组。下面是我做什么,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

我觉得很反直觉的,你可以用一个空的分隔符。因为你把任何数量的空分隔符都放在哪里(几乎),所有的数组长度都是相等的。实施以某种方式选择“最小”长度的事实并不改变这一操作没有多大意义的事实。在我看来,提出一个“NoEmptySeparator”例外会更合适。 – Bakuriu

回答

2

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

+1

您可以通过说:“如果您只是想将一个字符串拆分为一个字符数组,您可以只执行”myString.toCharArray()“,并且在数组中没有空字符串,它也更简单“ – justhalf

+0

虽然答案解决了OP想要达到的目标,但它并没有回答所问的问题。 – nitro2k01

13

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

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

更新:注释表明这个解释是不够的解释(它可能不是)...但是,它确实很简单:引擎从字符串的开始处开始,它看起来是否它的前面是什么符合模式。如果确实如此,它会将它背后的内容分配给拆分中的新项目。

在第一个字符上,它有“”(没有在它后面),并且它看起来是否在它前面有“”(模式)。有,所以它创建了一个“”匹配。

然后它继续前进,并且在它后面有'a',并且它再次在它前面有“a”。所以第二个结果是一个“a”字符串。

一个有趣的现象是,如果您使用split("", -1),您还将在结果数组的最后一个位置得到一个空字符串结果。


编辑2:如果我还破坏着我的大脑,并认为这是一个学术活动(我不会在现实生活中推荐这个......)我能想到的只有一个好办法做一个正则表达式一个字符串的split()到一个String[]数组中,每个字符串中有1个字符(与char []相反) - 其他人为其提供了很好的答案...)。

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

这看起来每个角色的背后,非捕获组,并在那一刹那,然后限制数组的大小,以字符数(你可以离开str.length()出来,但如果你把-1

String[] chars = str.split("(?!(^|$))"); 
+0

它没有解释“”是如何作为正在讨论的正则表达式。我已经做了一些正则表达式的东西,并从未尝试过任何与“”匹配,以便我了解它是如何工作的。有人或谁知道内部的java正则表达式代码可能能够更好地解释这一点。 – mangr3n

+1

这似乎是一个非常明确的解释。 “当你没有遇到任何东西时分割字符串,然后转到下一个字符”。请注意 - 第二部分很重要。你没有得到无限数量的空字符串;只有返回的第一个元素是空的,之后'split'算法至少增加一个。但不是第一次。仍然有点奇怪...... – Floris

+0

如果我想坚持使用split()函数,有什么办法可以修改代码来规避问题吗? – user2994814

0

我要读:你会得到在年底

借款nitro2k01在评论替代(低于该引用字符串开头和结尾的额外的空间)),您可以可靠地分割代码,了解实际情况如何“”作为一个正则表达式。但是,请记住它与空字符串匹配......并且参数是正则表达式,javadoc提到调用split(regex)与调用split(regex,0)相同。因此,如果剩余的字符串都是空格(或空格字符串),它不会再次匹配,这就是为什么它不匹配最后一个字符后的最终空字符串。

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

-1

我认为这将是更好地遍历字符串的字符,像这样:

use split("");. 
for (int i = 0;i < str.length(); i++){ 
    System.out.println(str.charAt(i)); 
} 
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 

+0

使用'strArr [i] = substring(i,i + 1)更容易(也更高效);' –

相关问题