关于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,写到这里就完了,欢迎大家来纠错!

    原文作者:暗暗
    原文地址: https://blog.csdn.net/a497393102/article/details/8617626
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞