A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗胜华 中级黑马   /  2013-3-27 12:18  /  1687 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


public class Test {
/**
  *
  */
public static void main(String[] args) {
      String s = "abc中国";
      //这时候abc中国是7个字节,如果我想读取6个字节,怎么保证它的完整度
      
      byte[] bytes = s.getBytes();
      
      getString(bytes,6);
}
public static String getString(byte[] b,int len) {
  int count = 0;
  String s =null;
  //汉字在内存中是负数的形式,所以找出负数的个数
  for(int i = 0; i<b.length; i++) {
       if(b[i]<0){
        count ++;
       }
     }
  if(count%2==0) {
   s = new String(b,0,len);
  }else{
   len--;
  }
  return s;
}
}
为什么结果得不到正确的答案?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
if(count%2==0) {
   s = new String(b,0,len);
  }else{
   len--;
  }
抽取你代码中有问题的一部分
你上面那段代码是说,如果没有半个汉字存在,即count%2==0为true时,执行 s = new String(b,0,len);这里没错,这样判断很巧妙
但是你的else那部分代码,如果存在半个汉字,len自减,自减后呢?是不是应该生成个字符串啊?你就让编译器把截取长度减1,没有让编译器照这个长度去重新截取一个字符串-。-这能正确的话,只能说jvm太智能了
else部分的代码加改成下面那样试试?
else{
   len--;
   s = new String(b,0,len);
  }

或许这样可以-。-我没运行过

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
首先不知道你预想的答案是什么?然后你整个程序没有一个打印语句怎么看到的结果?最后我在打印了一下 System.out.println(getString(bytes,6));,打印结果为:abc中?。。我觉得的这个结果也是对的,因为中国的国字由两个字节组成,你只获取了一个字节就打印了,也应该是个?符号。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
此题最关键就是判断是不是汉字,如果是汉字的话,就在截取的时候增加或者减少一个字节(根据题目要求,保全汉字),汉字有一个正则表达式,在API中可以查,

按你这种思路,即先获取汉字的字节,也是可以的,但是你要注意,一个汉字是以两个负数来表示的。只要这些原则了,我想还是能搞定的了,

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马