剛出來找工作那段時間,總是一遍一遍看有關於java面試題的講解和變成問題,其中有很多有趣的問題,是當時的我完全沒辦法編寫出來的,因爲剛畢業,我們着重學習的是jsp,對於java的基礎部分反而不是那麼牢固,所以,面試的過程中總是碰一鼻子灰,其中對一個題目的印象很深刻的是對一個字符串的拆分,要求是不能將中文拆分開,比如“123我是誰”,如果是ascii標準編碼,那麼中文時佔用兩個字節的,那麼現在要從3處開始拆分,從0到3總共經歷了四字節,程序要求的結果爲“123我”,而我們不能將它拆分成“123�”,當時面試的自己看到這個題目頭大了,真心的不會。不過對現在工作了快一年的我來說,也並是不那麼回事了,真正工作了,纔開始注重這些很基礎的東西,代碼纔開始寫得有那麼點味道了。好了,不說了,看看源碼吧。
新建一個文件爲“SplitChinese.java”,然後我將幾個方法分開列出來:
首先是spiltString方法,它返回的是拆分之後的最終結果字符串:
private static String spiltString(String resource, int index) {
if (resource == null) {
return "String is null";
}
byte[] strByte = resource.getBytes();
int byteLength = strByte.length;
if (index <= 0 || index > byteLength) {
return "out of index for this string";
}
int strLength = resource.length();
String[] tmpByte = new String[strLength];
for (int i = 0; i < strLength; i++) {
tmpByte[i] = resource.substring(i, i + 1);
}
int myIndex = getIndex(tmpByte, strLength, index);
byte[] resultByte = getBytesByIndex(tmpByte, myIndex);
if (resultByte == null) {
return "error";
}
String result = new String(resultByte);
return result;
}
上面的方法裏面,首先是判斷異常情況,我也就不多說了,然後是得到從那處開始拆分,也就是index索引值,注意,此處的索引值不是字節的索引值,而是一個字符串的索引值,比如“123我是誰”,從4開始拆分,4也就是字節索引值,而將“123我是誰”轉換成字節之後,判斷3處於哪個字中,本例中4處理“我”字中,而“我”處於字符串索引的3的位置,所以字節索引爲4,而字索引爲3。
下面是得到字索引的方法:
private static int getIndex(String[] tmpByte, int length, int index) {
int byteTotleMin = 0;
int myIndex = -1;
for (int i = 0; i < length; i++) {
byteTotleMin = byteTotleMin + tmpByte[i].getBytes().length;
if (byteTotleMin >= index) {
myIndex = i;
break;
}
}
return myIndex;
}
本方法接受三個參數,一個是字節數組,也就是遠字符串將每一位拆分成單獨的字符,一個是源字符串的長度,一個是從那個地方開始拆。我採用的是利用一箇中間int變量,來判斷循環是否到達了指定的位置,如果到達了,則返回此時此刻的數組ID,此ID也就是字索引。
最後看一個方法:
private static byte[] getBytesByIndex(String[] tmpByte, int index) {
if (index > tmpByte.length) {
return null;
}
index++;
byte[][] tmp = new byte[index][];
int count = 0;
for (int i = 0; i < index; i++) {
tmp[i] = tmpByte[i].getBytes();
count = count + tmp[i].length;
}
byte[] result = new byte[count];
int one = tmp.length;
int indexTmp = 0;
for (int i = 0; i < one; i++) {
int two = tmp[i].length;
for (int j = 0; j < two; j++) {
result[indexTmp] = tmp[i][j];
indexTmp++;
}
}
return result;
}
此方法接受兩個參數,一個時已經轉化成字符數組的字符串,一個是字索引,根據字索引,我將該字符串數組的前幾位組合起來,得到一個byte數組,然後返回。
最後在spiltString方法中根據返回的byte數組重新組合成字符串,輸出結果。
以前我也看到過一些關於此題目的解法,但當我自己來寫的時候,出現了一點小問題,我用的編碼是utf-8的,在我自己的電腦上面一箇中文時佔用三個字節的,而有些程序寫的是直接按照兩個字節一箇中文來處理的,這樣對於擴展性就不是很好了。
OK,寫到這裏就完了,歡迎大家來糾錯!