关于java面试题之拆分字符串,其中中文不能拆分成乱码
2013-02-27 15:09
99 查看
刚出来找工作那段时间,总是一遍一遍看有关于java面试题的讲解和变成问题,其中有很多有趣的问题,是当时的我完全没办法编写出来的,因为刚毕业,我们着重学习的是jsp,对于java的基础部分反而不是那么牢固,所以,面试的过程中总是碰一鼻子灰,其中对一个题目的印象很深刻的是对一个字符串的拆分,要求是不能将中文拆分开,比如“123我是谁”,如果是ascii标准编码,那么中文时占用两个字节的,那么现在要从3处开始拆分,从0到3总共经历了四字节,程序要求的结果为“123我”,而我们不能将它拆分成“123�”,当时面试的自己看到这个题目头大了,真心的不会。不过对现在工作了快一年的我来说,也并是不那么回事了,真正工作了,才开始注重这些很基础的东西,代码才开始写得有那么点味道了。好了,不说了,看看源码吧。
新建一个文件为“SplitChinese.java”,然后我将几个方法分开列出来:
首先是spiltString方法,它返回的是拆分之后的最终结果字符串:
上面的方法里面,首先是判断异常情况,我也就不多说了,然后是得到从那处开始拆分,也就是index索引值,注意,此处的索引值不是字节的索引值,而是一个字符串的索引值,比如“123我是谁”,从4开始拆分,4也就是字节索引值,而将“123我是谁”转换成字节之后,判断3处于哪个字中,本例中4处理“我”字中,而“我”处于字符串索引的3的位置,所以字节索引为4,而字索引为3。
下面是得到字索引的方法:
本方法接受三个参数,一个是字节数组,也就是远字符串将每一位拆分成单独的字符,一个是源字符串的长度,一个是从那个地方开始拆。我采用的是利用一个中间int变量,来判断循环是否到达了指定的位置,如果到达了,则返回此时此刻的数组ID,此ID也就是字索引。
最后看一个方法:
此方法接受两个参数,一个时已经转化成字符数组的字符串,一个是字索引,根据字索引,我将该字符串数组的前几位组合起来,得到一个byte数组,然后返回。
最后在spiltString方法中根据返回的byte数组重新组合成字符串,输出结果。
以前我也看到过一些关于此题目的解法,但当我自己来写的时候,出现了一点小问题,我用的编码是utf-8的,在我自己的电脑上面一个中文时占用三个字节的,而有些程序写的是直接按照两个字节一个中文来处理的,这样对于扩展性就不是很好了。
OK,写到这里就完了,欢迎大家来纠错!
新建一个文件为“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,写到这里就完了,欢迎大家来纠错!
相关文章推荐
- 关于JAVA中URL传递中文参数,取值是乱码的解决办法
- JAVA与C++::关于JNI中文字符串操作问题总结
- 关于使用java自带ZipOutputStream压缩文件名为中文的乱码问题
- java关于split分割字符串,空的字符串不能得到的问题
- 关于Java Servlet的中文乱码
- 关于使用java从http接口取数据保存到本地文件的中文乱码处理
- 关于使用中文分词工具ICTCLAS2013 Java版本乱码的问题
- 关于c++与java中文乱码问题分析与解决
- Java 关于中文乱码问题的解决方案与经验
- java 关于split分割字符串,空结果不能得到的问题,多个分隔符的处理
- 关于ubuntu10.04触摸板不能禁用和gedit文本编辑器中文乱码问题的一个解方案 转自:http://blog.csdn.net/luodayuan/archive/2010/05/23/5617615.aspx
- 关于Java web开发中文乱码问题的总结
- 看到一篇关于eclipse导入项目,java文件中文乱码的解决方案,先mark下
- 写一个函数, 2个参数, 1个字符串, 1个字节数,返回截取的字符串,要 求字符串中的中文不能出现乱码: 如 ( “ 我ABC”, 4) 应该截为 “ 我AB”,输入( “ 我 ABC汉DEF”, 6
- 关于使用java从http接口取数据保存到本地文件的中文乱码处理
- 关于javaweb中文写入数据库时乱码的解决方法
- 关于java中中文乱码问题
- 文《关于c++与java中文乱码问题分析与解决》中一个bug分析
- 关于前台URL传递中文参数到java后台乱码的问题