2013-11-15 30 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)更容易(也更高效);' –

相關問題