這個題目出自java程序員面試寶典,我看了半天覺得代碼有點小問題,做了點小修改,同時覺得這個題目蠻有意思,在此貼出來給大家討論下:
描述: 編寫一個截取字符串的函數,輸入爲一個字符串和字節數,輸出爲按字節截取的字符串。但是要保證漢字不被截取半個,如”我 ABC”,4“,應該截爲“我 AB”,輸入"“我 ABC 漢 DEF”,6",應該輸出爲“我 ABC”,而不是半個“我 ABC +漢的半個漢字”。(某公司面試題)
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class TestString {
public static void main(String[] args) throws IOException {
String s1 = "3我 ABC 是 chinese";
String s2 = "中 ";
int count = 9;
char c;
String original = new String(s1.getBytes("gbk"),"gbk");
System.out.println(original);
StringBuffer sb = new StringBuffer("");
if(s1 != null && !s1.equals("")){
if(count > 0 && count < original.length()){
for(int i = 0; i < count ; i++){
c = original.charAt(i);
// System.out.println("c:"+c);
if(String.valueOf(c).getBytes().length > 1){
--count;
if(i < count){
sb.append(c);
}
}
else{
sb.append(c);
}
}
}
}
System.out.println(sb.toString());
System.out.println(sb.toString().length());
}
}
結果爲:
3我 ABC 是 chinese
3我 ABC
7
在這裏重要的是要判斷字符c是否爲漢字,漢字與非漢字字符的字節數目是不同,但是如果 String s1 = "中";和String s2 = "f";s1.length() = s2.length() = 1;但是s1.getBytes().length = 2; s2.getBytes().length = 1;是否爲漢字通過這裏來區別,當碰到漢字時,我們就讓字節總數減1處理,當沒有超過總數count時,我們添加到StringBuffer中。