黑马程序员技术交流社区
标题:
一道基础测试题。
[打印本页]
作者:
(_演绎、青春
时间:
2015-1-1 18:09
标题:
一道基础测试题。
题目:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”, 截取3个字节也要是"HM"而不要出现半个中文。
public class Test10 {
public static void main(String[] args) throws Exception {
String str = "HM程序员";
int num = trimGBK(str.getBytes("GBK"),3);
System.out.println(str.substring(0,num) );
}
private static int trimGBK(byte[] buf, int n) {
// TODO Auto-generated method stub
int num = 0;
boolean bChineseFirstHalf = false;
for (int i = 0; i < n; i++)
{
if (buf[i] < 0 && !bChineseFirstHalf) {
bChineseFirstHalf = true;
} else {
num++;
bChineseFirstHalf = false;
}
}
return num;
}
}
复制代码
【这是一道基础测试题,我照着面试宝典上敲出来的,小弟基础不怎么好,有些代码还是看不懂,麻烦大神们附上注释。越详细越好,在此谢过!】
作者:
zhaozhao
时间:
2015-1-2 18:29
你如果使用substring方法的话,其实它的内部已经实现了取舍。这是我自己写的,你可以看一下:
/*
需求:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”, 截取3个字节也要是"HM"而不要出现半个中文。
分析:
1.要截取字符串,首先想到substring方法。
2.但是经过测试可知,substring方法其实,已经实现了取舍功能。
3.为了实现中文的自动截取,要知道中文编码GBK有如下特点:
中文的字节编码为负数。
*/
import java.lang.*;
class CutTest
{
public static void main(String[] args) throws Exception
{
String str = "HM程序员";
byte[] b = str.getBytes("GBK"); //将字符串转变为GBK编码的字节数组
String str1 = trimGBK(b,3); //调用函数获取截取后的子串
System.out.println(str1);
}
private static String trimGBK(byte[] buf, int num)throws Exception
{
StringBuilder s = new StringBuilder(); //使用该对象的append函数用于字符串拼接
for(int i=0;i<num;i++)
{
if(buf[i]>0) //如果大于零,说明是英文,直接加入字符串末尾
s.append((char)buf[i]);
else
{
if(buf[i]<0 && i<num-1) //如果小于0,说明是中文,如果i<num-1,说明没到结尾,将中文加大结尾
{
String str = new String(buf,i,2,"GBK");
s.append(str);
i++;
}
}
}
return s.toString();
}
}
复制代码
作者:
(_演绎、青春
时间:
2015-1-4 21:52
zhaozhao 发表于 2015-1-2 18:29
你如果使用substring方法的话,其实它的内部已经实现了取舍。这是我自己写的,你可以看一下: ...
虽然下面的trimGBK方法中还是有点不太理解,不过还是要谢谢大神了:handshake
作者:
随影
时间:
2015-1-6 20:19
package com.itheima;
/*
编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,
截取3个字节也要是"HM"而不要出现半个中文
*/
public class Test10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="HM程序员";
//测试程序
String newStr=splitString(str,1);
System.out.println(newStr);
}
public static String splitString(String str,int len)
{
String newStr=null;
byte[] bytes=str.getBytes();//将字符串转换成字节数组。
if(len>=bytes.length)
{
return str;
}else
{
//按照给定角标,截取一个新字符串。
newStr=new String(bytes,0,len);
//新字符串的长度。
int newlen=newStr.length();
//比较截取后的新字符串最后一个元素与原字符串最后一个元素是否相等
if(newlen>=2)
{
if(newStr.charAt(newlen-1)!=str.charAt(newlen-1))
{
//如果新字符串最后一个元素与原字符串最后一个元素不等,则比较倒数第二个元素,如果不相等,则去掉最后两元素
if(newStr.charAt(newlen-2)!=str.charAt(newlen-2))
{
newStr=new String(bytes,0,len-2);
}else
{ //如果相等,则只去掉最后一个元素。
newStr=new String(bytes,0,len-1);
}
}
}else{
//否则如果新字符串长度为1
if(newStr.charAt(newlen-1)!=str.charAt(newlen-1))
{
newStr=null;
}
}
}
return newStr;
}
}
作者:
zw937820438
时间:
2015-1-6 20:53
参看一下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2