關於java面試題之拆分字符串,其中中文不能拆分成亂碼

剛出來找工作那段時間,總是一遍一遍看有關於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,寫到這裏就完了,歡迎大家來糾錯!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章