2017-10-08 70 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」開頭,則會發生同樣的情況:在這種情況下,您的拆分數組的第一個元素將是「」。

相關問題