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的数");
}
}
}
|
|