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


7223
2017-11-15 04:10


起源

我觉得你可以使用一个空的分隔符非常违反直觉。因为您可以在任何地方放置任意数量的空分隔符(几乎)所有数组长度都同样有效。实现以某种方式选择“最小”长度的事实并没有改变这个操作没有多大意义的事实。在我看来,提出“NoEmptySeparator”例外会更合适。 - Bakuriu


答案:


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

13
2017-11-15 04:16



它没有解释“”作为正则表达式如何工作在这里有争议。我已经做了一些正则表达式的东西,并且从未尝试过任何与“”的匹配,这样我就能理解它是如何工作的。在内部拥有或知道java正则表达式代码的人可能能够更好地解释这一点。 - mangr3n
这似乎是一个非常明确的解释。 “当你什么也没遇到时拆分字符串,然后转到下一个字符”。注意 - 第二部分很重要。你没有获得无限数组的空字符串;只返回的第一个元素是什么,之后是 split 算法递增至少一个。但不是第一次。还是有点奇怪...... - Floris
不,因为我能想到的唯一正则表达式,“”,也匹配前端的空字符串。你必须考虑它,而不是“修复”它。最有效(性能)的方法是toCharArray()。 - mangr3n
str.split("(?!^)") - nitro2k01
好吧,如果你想进入愚蠢的领域,你可以使用 "(?!(^|$))"。但耶耶。 - nitro2k01


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


2
2017-11-15 04:16



您可以通过以下方式改进此答案:“如果您只想将String拆分为字符数组,则可以执行”myString.toCharArray()“,并且数组的begninning中不会出现空字符串,而且它也更简单“ - justhalf
虽然答案解决了OP希望实现的目标,但它没有回答所提出的问题。 - nitro2k01


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

调用的功能可能更好 str.toCharArray();


0
2017-11-15 04:21





你也可以尝试这种方式

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
2017-11-15 04:23



它更容易(也更有效)使用 strArr[i] = substring(i,i+1); - ratchet freak