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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package cn.itcast.day14.exercise;


  2. public class Exercise7 {

  3.         public static void main(String[] args) {
  4.                 String s = "中驫文abc";                        // 4
  5.                 print(s, 3);
  6.                 print(s, 4);
  7.                 print(s, 5);
  8.                 print(s, 6);
  9.                 print(s, 7);
  10.                
  11.                 /*
  12.                 byte[] arr = s.getBytes();
  13.                 System.out.println(Arrays.toString(arr));
  14.                 System.out.println(isCnBegin(arr, 2));
  15.                 System.out.println(isCnBegin(arr, 3));
  16.                 System.out.println(isCnBegin(arr, 4));
  17.                 System.out.println(isCnBegin(arr, 5));
  18.                 */
  19.         }
  20.        
  21.         /*
  22.          * 从s字符串中打印count个字节, 不能打印出半个中文
  23.          * 如果count位置是中文的前半, 那么不打印
  24.          */
  25.         public static void print(String s, int count) {
  26.                 byte[] arr = s.getBytes();
  27.                 count = isCnBegin(arr, count - 1) ? count - 1 : count;
  28.                 System.out.println(new String(arr, 0, count));
  29.         }
  30.        
  31.         // GBK码表, 英文是1个正数, 中文第一个是负数, 第二个可正可负
  32.         // 负数  并且 前一个不是中文前半
  33.         public static boolean isCnBegin(byte[] arr, int index) {
  34.                 boolean b = false;                // b代表前一个字节是否是中文的前一半
  35.                 for (int i = 0; i <= index; i++)
  36.                         b = arr[i] < 0 && !b;        // 当前字节是负数, 并且前一个不是中文前一半, 当前就是中文前一半
  37.                 return b;
  38.         }

  39. }
复制代码
谁能告诉我 isCnBegin()方法内是如何循环,一次结果是什么。。 我看不太明白这里~~~

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

1 个回复

倒序浏览
首先是参数byte[] arr  它的内容是这样的:[-42, -48, -13, 81, -50, -60, 97, 98, 99]
一个汉字两个字节 前一半是负数 后一半可正可负,
然后是方法内部:
boolean b = false;                // b代表前一个字节是否是中文的前一半
此处默认是false  那么它就代表了 默认前一个字节不是中文的前一半;
再次是循环体:
b = arr[i] < 0 && !b;        // 当前字节是负数, 并且前一个不是中文前一半, 当前就是中文前一半
此处注释我个人认为有点问题,b的内容判断是:当前字节是负数,并且前一个是中文的前一半(因为b默认是fasle  !b就是true);
然后把b返回

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

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