2017-10-08 83 views
5

我的问题是,为什么下面的程序:split()方法在java中如何工作?

// Java program to demonstrate working of split(regex, 
// limit) with high limit. 
public class GFG 
{ 
    public static void main(String args[]) 
    { 
     String str = "[email protected]@geekss"; 
     String [] arrOfStr = str.split("s", 5); 
    } 
} 

分割字符串"[email protected]@geekss"到5子:​​。据我说,应该有4个子字符串:{"geek", "","@[email protected]", ""}。有人能澄清我的疑问吗?

+3

你为什么不解释你为什么期望获得不同的结果? – shmosel

回答

4

如果在文档仔细看:

通过此方法返回的数组中包含该字符串的各子串被另一个串给定的表达被端封端的匹配端的字符串

所以你的结果数组包含两件事情:

  • 您的字符串的一个子之后是s(斜体部分)
  • 无论是在你的字符串(黑体部分)留底

你得到{"geek", "", "@[email protected]", ""}为前四个元素的原因是因为他们后面跟着s。你得到的最后一个""是匹配每个s后剩下的内容。

请注意,您通过的5的参数limit也是相关的。按照文档:

如果限制n大于零,则该模式将至多n被施加 - 1次,阵列的长度将是不大于N,和阵列的最后一个条目将包含所有输入超出最后匹配的分隔符。

所以最后匹配的分隔符是s的最后。之后,仍然有一个空的字符串,它没有检查。

+0

你的最后一句话不能很好地解释发生了什么。 –

+0

@TimBiegeleisen编辑后更好吗?我只是试图用不同的方式来解释这一点。 – Sweeper

+0

明白了......谢谢 –

1

Split("s", 5)发现4秒字符,并返回5个subtrings它们是两个顺序's'之间任何存在这样的空的子串,或从字符串直到第一“S”的开始和从最后的“直到字符串的结束。所以你有5个子字符串。

如果你看看@ tobias_k非常有用的评论,你有4的'字符而不是5,拆分方法中的第二个参数(数字5)告诉有多少子字符串,如果我们删除s,在那里4秒是5个子字符串,如果您尝试使用大于5的任何数字,则会得到相同的结果,因为没有其他子字符串需要分割。

+3

只有4个's',而不是5个。 –

+0

刚刚检查过的数字5是指子字符串而不是字母's',因此对于4s 5的子字符串存在,如果我们放置4而不是5,它不会破坏最后一个子字符串,感谢评论! – coder

2

这里是正在发生的图形解释:

^geek s s @[email protected] s s $ 
geek |""| @[email protected] |""|"" 

在最后一个分隔符和$之间的位置将被计为一个空字符串匹配。请注意,如果您的字符串以s开头,那么您也会选取一个空字符串。

为什么我们碰巧看到5个匹配的琐碎原因是因为您的拆分限制大于或等于5,但这不能解释输出。

+0

@Marvin不,我想我的观点很清楚。限制仅仅意味着应用模式5次,但并不能解释为什么我们会得到这些匹配。 –

+0

@Marvin操作系统明确要求“根据我应该有4个子字符串”,并解释为什么最后有两个空字符串匹配。我已经回答了这个。 –

+0

@Marvin如果这确实是个问题,那么OP应该被低估,因为通过查看Javadoc可以在10秒内回答OP。 –

0

你的字符串是 “geekss @为@ geekss”,所以如果你考虑的“作为您的分隔符,您将获得:

”怪胎“ + 'S'] + ”“ + 'S' ] + “@为@怪胎” + 'S'] “” + 'S'] + “”

所以,你必须["geek", "", "@[email protected]", "", ""]

也许这是混淆了你的部分是最后一个空字符串。 认为分隔符总是被“包含”在字符串中。 所以如果它发生在它的最后,它实际上被认为是 "your_string" + your_delimiter + ""

如果您的字符串以“s”开头,则会发生同样的情况:在这种情况下,您的拆分数组的第一个元素将是“”。