黑马程序员技术交流社区
标题:
按字节截取字符串 不能出现半个汉字
[打印本页]
作者:
農邨尛夥兒
时间:
2014-12-25 13:08
标题:
按字节截取字符串 不能出现半个汉字
import java.util.ArrayList;
import java.util.List;
/*
* 10、编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
*
*/
public class Test10 {
/*
* 首先考虑的是奇数-1 但是发现前面是三个字符的话 不对
* 解题思路:将字符串转换为字节数组
* 遍历判断需要-1的脚标
* 查看脚标是否需要减一
*
*/
public static void main(String[] args) {
System.out.println(subMethod("HM程序员", 2));
System.out.println(subMethod("HM程序员", 3));
System.out.println(subMethod("HM程序员", 4));
System.out.println(subMethod("HMD李雄", 5));
System.out.println(subMethod("HM李雄",0));
}
private static String subMethod(String str, int subIndex) {
// TODO Auto-generated method stub
//将字符串转换为字节数组
byte[] bytes = str.getBytes();
//创建list对象 存储不会出现半个汉字的角标
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < bytes.length; i++) {
//如果bytes[i]<0说明是个汉字 i+1
if(bytes[i]<0)
list.add(++i);
else
list.add(i);
}
// System.out.println(list);
//判断输入的截取数
//如果截取数>bytes.length 返回原字符串
if(subIndex>0){
if(subIndex>bytes.length){
return str;
} else {
//如果输入角标位置(subIndex-1)存在于list内直接截取
if(list.contains(subIndex-1)){
return new String(bytes,0,subIndex);
} else {
//不存在-1截取
return new String(bytes,0,subIndex-1);
}
}
}else{
throw new RuntimeException("请输入大于0的数");
}
}
}
作者:
wata
时间:
2014-12-25 13:22
package com.itheima;
import java.io.UnsupportedEncodingException;
/*
10、编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,
截取3个字节也要是"HM"而不要出现半个中文。
*/
public class Test10 {
public static void main(String[] args){
//System.out.println(getSubString("HM程序员",0));
System.out.println(getSubString("HM程序员",2));
System.out.println(getSubString("HM程序员",3));
System.out.println(getSubString("HM程序员",4));
System.out.println(getSubString("HM程序员",5));
System.out.println(getSubString("HM程序员",6));
System.out.println(getSubString("HM程序员",7));
System.out.println(getSubString("HM程序员",8));
System.out.println(getSubString("HM程序员",9));
}
public static String getSubString(String str, int num){
byte[] b = null;
try {
b = str.getBytes("GBK");//指定GBK编码,并处理异常。
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if(num>b.length){//如果截取值num大于字符串b长度,则返回整个字符串str。
return str;
}else if(num<=0){//如果截取值num<=0,则抛出运行时异常。
throw new RuntimeException("截取值num必须为大于0的整数。");
}else if(num%2==1 && (byte)b[num-1]<0){//如果截取值num是奇数,并且最后一个字节是汉字的一半,则少输出一个字节。
/*
* 原理:GBK编码表中,汉字由2字节表示,且2个字节前的最高位都是1,
* 在byte类型中,最高位1代表负数。
* 所以只要(byte)b[num-1]<0,就说明最后一个字节是汉字的一半。
* */
num--;
}
//截取得到新字节数组。
byte[] newb=new byte[num];
for(int x=0;x<num;x++){
newb[x]=b[x];
}
//將字符转回字符串。
String newStr=new String(newb);
return newStr;
}
}
复制代码
作者:
農邨尛夥兒
时间:
2014-12-25 17:01
wata 发表于 2014-12-25 13:22
你这种思考仅仅是面向老师给出的字符串"HM程序员"的方法
如果给定的字符串是"HM程X序员",你的程序就会读出半个汉字的
QQ截图20141225170038.png
(1.3 KB, 下载次数: 17)
下载附件
2014-12-25 17:01 上传
这是运行结果!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2