----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
第一种:
package it.cast.demo;
import java.io.IOException;
public class Demo3 {
/**
* @param args
* 题目:
* 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,
* 但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,
* 应该输出“我ABC”,而不是“我ABC+汉的半个”。
* 思路:
* 1、定义一个字符
* 2、将字符串转换成字节数组(GBK码)
* 3、定义一个方法用来判断应截取多少位
* 4、定义一个变量count存负数的个数,
* 5、计算负数的个数
* 6、判断负数奇偶,如果为偶:说明有完整的汉字,如果为奇:说明最后一个字只有一半
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String str="我ABC汉DEF";
int num=getString(str.getBytes("GBK"),8);
String substr=str.substring(0, num);
System.out.println(substr);
}
public static int getString(byte[] bytes, int i) {
int count=0;
for(int x=0;x<i;x++){
if(bytes[x]<0){
count++;
}
}
if(count%2!=0){
return i-(count+1)/2;//因为要取出的是字符,所以要考虑取出的位数:
//比如 HM黑马,按字节算有6位,但按字符算只有4位,
//字符中汉字只算一位,字节中汉字算二位
}
return i-count/2;
}
}
----------------------------------------------------------------------------------------------------------------------------------------
第二种:
publicstatic void main(String[] args) throws Exception{
Stringstr = "我a爱中华abc我爱传智def';
Stringstr = "我ABC汉";
intnum = trimGBK(str.getBytes("GBK"),5);
System.out.println(str.substring(0,num));
}
publicstatic int trimGBK(byte[] buf,int n){
intnum = 0;
booleanbChineseFirstHalf = false;
for(inti=0;i<n;i++)
{
if(buf[i]<0&& !bChineseFirstHalf){
bChineseFirstHalf= true;
}else{
num++;
bChineseFirstHalf= false;
}
}
本题主要考的是编码的特征,要仔细读题,否则一定会出错。
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com