java - 拆分字符串后,数组中的第一个元素是啥?

Posted

技术标签:

【中文标题】java - 拆分字符串后,数组中的第一个元素是啥?【英文标题】:java - after splitting a string, what is the first element in the array?java - 拆分字符串后,数组中的第一个元素是什么? 【发布时间】:2013-11-28 09:24:36 【问题描述】:

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

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

【问题讨论】:

我发现您可以使用空分隔符非常违反直觉。因为您将任意数量的空分隔符放在您想要(几乎)所有数组长度同样有效的地方。实现以某种方式选择“最小”长度的事实并没有改变这个操作没有多大意义的事实。在我看来,引发“NoEmptySeparator”异常会更合适。 【参考方案1】:

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

【讨论】:

您可以通过说:“如果您只想将字符串拆分为一个字符数组,您可以执行“myString.toCharArray()”来改进这个答案,并且不会有空数组开头的字符串,也更简单" 虽然答案解决了 OP 想要实现的目标,但它并没有回答所提出的问题。【参考方案2】:

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

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

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

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

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

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


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

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

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

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

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

【讨论】:

它没有解释 "" 是如何作为正则表达式工作的,这是这里的问题。我做了一些正则表达式的东西,从来没有尝试过任何与“”的匹配,这样我就明白它是如何工作的。拥有或知道内部 Java 正则表达式代码的人可能能够更好地解释这一点。 这似乎是一个很清楚的解释。 “没有遇到什么就拆分字符串,然后转到下一个字符”。注意 - 第二部分很重要。你不会得到一个无限的空字符串数组;只有返回的第一个元素什么都不是,之后split 算法至少增加一个。但不是第一次。还是有点奇怪…… 如果我想坚持使用 split() 函数,有什么办法可以修改代码来规避问题? 不,因为我能想到的唯一正则表达式“”也匹配前端的空字符串。你必须考虑它,而不是“修复”它。最有效(性能)的方式是 toCharArray()。 好吧,如果你想进入这个愚蠢的领域,你可以使用"(?!(^|$))"。但是是的。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

你也可以这样试试

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

根据

【讨论】:

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

以上是关于java - 拆分字符串后,数组中的第一个元素是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java拆分功能消除空间

java 怎样将数组里的元素进行拆分

java中的数组元素标识符是啥?

jquery拆分数组,块的最后一个元素是下一个块的第一个元素

仅按 golang 中的第一个元素拆分字符串

Java中的Vector是啥意思?