刚出来找工作那段时间,总是一遍一遍看有关于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,写到这里就完了,欢迎大家来纠错!