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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.itheima;

/*
* 10、编写函数,从一个字符串中按字节数截取一部分,
* 但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,
* 截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
*
*
*
* */

public class Test10 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
                String str = cutStringByByte("a周tu木h安bcd",6);
                System.out.println(str);
               
               

        }
       
        public static String cutStringByByte(String str,int num){
                int sum = 0;
                StringBuffer sb = new StringBuffer();
                char[] array = str.toCharArray();
                for(int i=0;i<array.length;i++){
                        if(array[i]>=128){
                                if((num-sum)>=2){
                                        sb.append(array[i]);
                                        sum+=2;
                                }else{
                                        sum+=2;
                                }
                        }else{
                                sb.append(array[i]);
                                sum++;
                        }
                        if(sum>=num){
                                break;
                        }
                       
                }
                return sb.toString();
        }

}

评分

参与人数 2技术分 +1 黑马币 +19 收起 理由
周水林 + 19 很给力!
The_king丶 + 1 赞一个!

查看全部评分

17 个回复

倒序浏览
好厉害 ,我怎么没有这道题
回复 使用道具 举报
好厉害,我用递归写法,写的头晕,比这个代码写的多多了,呵呵
回复 使用道具 举报
基础很扎实 啊
回复 使用道具 举报
中文2个字节,英文字母1个,作为判断条件,添加到StringBuilder中。 很好的思路。
回复 使用道具 举报
楼主屌炸天
回复 使用道具 举报
回头好好看看
回复 使用道具 举报
厉害厉害啊!!
回复 使用道具 举报
本帖最后由 ζ_____________ 于 2014-9-29 12:04 编辑

测试了一下,发现有一处错误~

for(int i=0;i<array.length;i++){
                        if(array>=128){
                                if((num-sum)>=2){
                                        sb.append(array);
                                        sum+=2;
                                }else{
                                        sum+=2;
                                }
                        }else{
//                                sb.append(array);   //这里判断出的结果是字母哒,不应该append到sb里去了.
                                sum++;
                        }
                        if(sum>=num){
                                break;
                        }



将字符串封装到数组中进行遍历
判断依据是根据字母的ASCII码上限(或者是字母占用的字节数)
再添加到StringBuilder中,方便转回字符串.
结束依据是定义的计量字节数的计数器进行递增,
判断比截取的字节数值大即为函数结束.

好厉害!~ 感谢楼主提供的思路~
回复 使用道具 举报
楼主好人
回复 使用道具 举报
我也有这道题。刚开始的时候一点思路也没有。后来静下来仔细想一想。

慢慢的就写出来了,就感觉没有那么难了,其实很基础的东西。

只是陌生没有见过的题一下就慌了,多做题才是硬道理。
回复 使用道具 举报
本帖最后由 caixingke 于 2014-9-29 15:44 编辑

我当时做的也是这一个题, 我向黑马提交的代码就是下面这个:
  1. public class Test10 {

  2.     /*
  3.      * 从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
  4.      * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,
  5.      * 截取3个字节也要是"HM"而不要出现半个中文
  6.      *
  7.      * 代码思路:
  8.      * 我们从第0个字节开始读,
  9.      * 如果一个字节在0x00-0x7F之间, 则我们认为是单字节字符, 那么我们count++继续读下一个字节.
  10.      * 如果一个字节不在 0x00-0x7F范围内, 则我们认为是双字节字符, count+=2继续读下去.
  11.      * 一直到读完这个缓冲区为止.
  12.      */
  13.     public static byte[] getBytesFromGBKBuffer(byte[] gbkBuffer, int length) {
  14.         try {
  15.             if (gbkBuffer == null || length <= 0) { // 输入不合法, 抛出异常
  16.                 throw new Exception("输入不合法");
  17.             } else if (length >= gbkBuffer.length) { // 长度越过这个字串本有的长度, 则直接返回
  18.                 byte[] buffer = new byte[length];
  19.                 System.arraycopy(gbkBuffer, 0, buffer, 0, length);
  20.                 return buffer;
  21.             } else {
  22.                 int count = 0; // 用来指向当前在哪一个字节
  23.                 while (true) {
  24.                     // 如果一个字节在0x00-0x7F之间, 我们判断其是单字节字符, 否则其被认为是双字节字符
  25.                     // 对于补码为0x80-0xFF的, 其是负数, 小于0.
  26.                     if ((int) gbkBuffer[count] < 0x80
  27.                             && (int) gbkBuffer[count] > 0x00) { // 如果是单字节
  28.                         if (count == length - 1) {
  29.                             // gbkBuffer[count]已经是我们要取得的最后一个字符了, 所以直接返回.
  30.                             break;
  31.                         } else {
  32.                             // 因为不是最后一个字节, 所以继续
  33.                             // 因为当前这个字符是一个单字节字符, 所以用count++来取下一个字符的首字节.
  34.                             count++;
  35.                         }
  36.                     } else {
  37.                         if (count == length - 1) {
  38.                             // 如果当前字节是最后一个字节, 但因为当前字符是双字节字符,
  39.                             // 所以为了保持完整性, 不要掉这个字符, count回退.
  40.                             count--;
  41.                             break;
  42.                         } else if (count == length - 2) {
  43.                             // 如果单前这个字符达到了所要求的长度, 那么就退出.
  44.                             // 因为当前字符是双字节, 所以count应再往前移动一格.
  45.                             count++;
  46.                             break;
  47.                         } else {
  48.                             // 因为当前这个字符是双字节字符, 所以这里加2来取下一个字符的首字节.
  49.                             count += 2;
  50.                         }
  51.                     }
  52.                 }
  53.                 // 把buffer做为返回值来返回.
  54.                 int len = count + 1;
  55.                 byte[] buffer = new byte[len];
  56.                 System.arraycopy(gbkBuffer, 0, buffer, 0, len);
  57.                 return buffer;
  58.             }
  59.         } catch (Exception e) {
  60.             System.err.println(e.getMessage());
  61.             e.printStackTrace();
  62.             return null;
  63.         }
  64.     }

  65.     public static void main(String[] args) {
  66.         // 测试用例
  67.         try {
  68.             String s = "TM黑马";
  69.             // =========================
  70.             byte[] a = getBytesFromGBKBuffer(s.getBytes("GBK"), 3);
  71.             System.out.println(new String(a, "GBK")); // 打印: TM
  72.             // =========================
  73.             byte[] b = getBytesFromGBKBuffer(s.getBytes("GBK"), 4);
  74.             System.out.println(new String(b, "GBK")); // 打印: TM黑
  75.             // =========================
  76.             byte[] c = getBytesFromGBKBuffer(s.getBytes("GBK"), 5);
  77.             System.out.println(new String(c, "GBK")); // 打印: TM黑
  78.             // ==========================
  79.             byte[] d = getBytesFromGBKBuffer(s.getBytes("GBK"), 6);
  80.             System.out.println(new String(d, "GBK")); // 打印: TM黑马
  81.             // =========================
  82.         } catch (UnsupportedEncodingException e) {
  83.             // TODO Auto-generated catch block
  84.             e.printStackTrace();
  85.         }

  86.     }
  87. }
复制代码





回复 使用道具 举报
:(我不会,,,
回复 使用道具 举报
谢谢楼主分享
回复 使用道具 举报
Eagle 高级黑马 2014-9-29 18:26:24
15#
都是大神啊。目测好多。
回复 使用道具 举报
谢谢楼主分享,看懂了,
回复 使用道具 举报
受教了~~~
回复 使用道具 举报
谢谢楼主分享哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马