對於Strig類的這個split方法,碰到過多次,參考了很多網上的資料,現在整理總結一下
1:split函數第二個參數的用法
在論壇上看到了一個問題,然後興起了對這個函數進一步探究的興趣:
首先,使用只有一個參數的split:
public class SplitTest {
/**
* @param args
*/
public static void main(String[] args) {
String str = "what,is,,,,that";
String[] strs = str.split(",");
System.out.println(strs.length);
}
}
輸出結果是6;但是,如果字符串變爲
[java] view plaincopy
"what,is,,,,"呢?看起來應該是5,其實不然,對用只有一個參數的函數split,輸出結果是2
測試代碼:
<pre name="code" class="java">public class SplitTest {
/**
* @param args
*/
public static void main(String[] args) {
String str = "what,is,,,,";
String[] strs = str.split(",");
System.out.println(strs.length);
}
}
問題來了,如何將
"what,is,,,,";
這個字符串按照逗號分隔,並且逗號之間沒有內容的就存儲爲空呢?
很簡單,用第二個split函數,將第二個參數設置爲-1就可以了,測試代碼如下:
public class SplitTest {
/**
* @param args
*/
public static void main(String[] args) {
String str = "what,is,,,,";
String[] strs = str.split(",", -1);
System.out.println(strs.length);
}
}
結果爲6;
那麼後邊的這個int類型的參數是幹麼用的?很簡單,設定利用split函數截取字符串,截取的結果的閥值。-1表示無限制,雖然直接用只有一個參數的split函數也是無限制,但是那樣的話,後面如果分隔符之間爲空的話,就不會截取。
二 split方法技巧點
在java.lang包中有String.split()方法返回是一個字符型數組,但使用過程中還有一些小技巧。
如執行:"2|33|4".split("|")
出來的結果是:
""
2
|
3
3
|
4
奇怪吧,不過注意看一下API說明還是知道原因的.
java.lang.string.split
split 方法
將一個字符串分割爲子字符串,然後將結果作爲字符串數組返回。
stringObj.split([separator,[limit]])
參數
stringObj
必選項。要被分解的 String 對象或文字。該對象不會被 split 方法修改。
separator
可選項。字符串或 正則表達式對象,它標識了分隔字符串時使用的是一個還是多個字符。如果忽略該選項,返回包含整個字符串的單一元素數組。
limit
可選項。該值用來限制返回數組中的元素個數。
說明
split 方法的結果是一個字符串數組,在 stingObj 中每個出現 separator 的位置都要進行分解
所以正常的寫法是這樣的:
1、如果用“.”作爲分隔的話,必須是如下寫法:String.split("\\."),這樣才能正確的分隔開,不能用String.split(".");
2、如果用“|”作爲分隔的話,必須是如下寫法:String.split("\\|"),這樣才能正確的分隔開,不能用String.split("|");
“.”和“|”都是轉義字符,必須得加"\\";(這裏是利用了java中正則表達式的一個點)
3、如果在一個字符串中有多個分隔符,可以用“|”作爲連字符,比如:“a=1 and b =2 or c=3”,把三個都分隔出來,可以用String.split("and|or");
三 字符串反轉遇到問題引出來的
題目如下:
String str = " i am a programmer";其中空格個數分別是1,2,3個
要求按照單詞反轉,也就是最後輸出“programmer a am i"; 空格數分別爲3,2,1。
1:用split函數方式:
public static void reverse() {
String s = "i am a programmer"; // 幾個空格的數量分別爲1,2,3
String[] eg = s.split(" ", -1);
String result = "";
for (int i = eg.length - 1; i > 0; i--) {
result += eg[i] + " ";
}
result += eg[0]; // 這裏要注意第一個字符的前面是不能增加空格的。否則就多了一個空格,所以從後面往前面遍歷
System.out.println(result);
這裏一直有一個模糊點,就是如果對於連續多個空格在一起,但是要求分割的時候只用一個空格,其它的空格還不能刪除,到底怎麼辦?需要看看split函數是怎麼處理的。爲了可視,將空格換作”,“。
String oldStr = "z,,,z";
String[] strs = oldStr.split(",");
for(String str:strs) {
System.out.println(str);
}
可以改變字符串之間的”,“的個數來查看,從運行結果可以看到,在分割字符串”z,,,z“時,首先把字符串分爲”z“和”,,z“兩個字符串,第二步操作字符串”,,z“,分爲一個空字符串和”,z“字符串,繼續分爲一個空字符串和一個z,最後結果如下:中間兩行是null
z
z
2:不用split函數:
String oldstr="I am a programmer";
int index = oldstr.lastIndexOf(" ");
System.out.println(index);
while (index >= 0) {
System.out.print(oldstr.substring(index + 1) + " ");
oldstr = oldstr.substring(0,index);
index = oldstr.lastIndexOf(' ');
}
System.out.println(oldstr);
爲了能清楚的看到運行結果,我們把空格換爲“,”。
viewplainprint?
String oldstr="I,am,,a,,,programmer";
int index = oldstr.lastIndexOf(",");
while (index >= 0) {
System.out.print(oldstr.substring(index + 1) + ",");
oldstr = oldstr.substring(0,index);
index = oldstr.lastIndexOf(',');
System.out.println(index);
}
這樣的話,裏面有兩點如果不清楚的話就會導致不理解,首先subString(index)方法,是值從第index個字符開始往後的字符串。第二subString(0,index)的字符串不包括index位的字符。
作者:Allen_Zhao_2012