需求:
编写一个截取字符串的函数,输入为一个字符串和一个字节数,输出为按字节截取的字符串。但是要保证汉字不被截取半个,如("我ABC",4)应该截取为(“我AB”.输入“我ABC汉DEF”,6)应该是“我ABC”而不是“我ABC+汉的半个”。
我的思路:
1、将字符串转化成字符数组,
2、在循环里面遍历字符数组的元素,在循环外定义一个length变量初始值为0,用来记录已经遍历的长度;定义一个初始值为空字符串的字符串变量str,存储遍历过的元素。
3、每次遍历,如果是一个字节长度的元素,length+1,如果是2个字节长度的元素,lenght+2。
4、每遍历一次,判断length的值,
不满组截取长度的情况:如果length小余要截取的字节长度,将遍历的元素与str相连接,并继续遍历。
满足截取长度的情况:1、如果length等于要截取的字节长度,将遍历元素与str字符串连接,并退出循环。
2、如果length大于要截取的字节长度,说明该次遍历的是一个汉字,不需要截取半个汉字,所以直接退出循环。
5、返回str字符串。
代码:
public class TestSubString {
public static void main(String[] args) {
String a = "abc你好123";
a = subStr(a,6);
System.out.println(a);
}
public static String subStr(String str ,int end){
int length=0;
char[] ch = str.toCharArray();
String str2 = "";
for(int i =0;i<str.length();i++){
// int num = Character.codePointAt( ch,i);
// int num = Character.codePointAt( str,i);
int num = str.codePointAt(i); //改行代码与上两行代码实现的效果一致,获取当前遍历元素的值。小于等于255是一个字节,超过255是两个字节
if(num>=0&&num<=255){
length++;//字节数加1
}else{
length+=2;//字节数加2
}
if(length<end){ //没有达到截取字节长度继续循环,并将遍历的元素与str字符串连接
str2+=ch[i];
}else if(length==end){ //正好达到截取字节长度,就退出循环,并将遍历的元素与str字符串连接
str2+=ch[i];
break;
}else{ //超过长度,是因为当前遍历的是中文字符元素,不截取半个中文,所以直接退出循环。
break;
}
}
return str2; 返回拼接的新字符串
}
}