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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

箬竹小筑

初级黑马

  • 黑马币:0

  • 帖子:6

  • 精华:0

© 箬竹小筑 初级黑马   /  2014-2-9 17:22  /  1615 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)

例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
这个题目,看了其他人的编写方式,不能理解,求助
回复 使用道具 举报
主要是中国汉字的编码 组成汉字的两个编码都是负数
回复 使用道具 举报
  1. package com.itheima;

  2. import java.io.UnsupportedEncodingException;

  3. /*
  4. * 10、 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
  5. *      如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  6. */
  7. public class Test10 {
  8.         public static void main(String args[]) {
  9.         String str = "HM程序员";
  10.         int len = 2;
  11.         byteSubStr(str, len);
  12.         }

  13.         public static void byteSubStr(String str, int len) {
  14.                 String s = null; // 初始化字符串s,赋值为空
  15.                 // 传入的字符串不能为空
  16.                 if (str != null) {
  17.                         byte[] a = null; // 初始化字节数组,赋值为空
  18.                         try {
  19.                                 a = str.getBytes("GBK"); // 将字符串转化为字节数组,GBK码表,此时字节数组的长度为14
  20.                         } catch (UnsupportedEncodingException e) { // 捕捉编码失败异常
  21.                                 e.printStackTrace();
  22.                         }
  23.                         // System.out.println("String length:"+a.length);打印字节数组的长度
  24.                         if (a.length <= len) {
  25.                                 s = str; // 如果要求取出的字节长度大于字节数组应有长度,则将s初始化为str
  26.                         } else if (len > 0) {
  27.                                 s = new String(a, 0, len); // 如果字节长度在字节数组长度范围内,则根据要求取出长度len,创建新的字符串s。
  28.                                 int length = s.length(); // 获取新字符串的长度
  29.                                 // System.out.println(s.length());
  30.                                 if (str.charAt(length - 1) != s.charAt(length - 1)) {// 如果原字符串中相应位置上的字符与
  31.                                         // 新字符串相应位置上的字符不相等,说明新字符串中相应位置只有半个中文,则应该讲数组指针向左移一位,形成新的子串。

  32.                                         if (length < 2) {
  33.                                                 s = null; // 如果新字符串的长度小于2,则将新字符串赋值为空。
  34.                                         } else {
  35.                                                 s = s.substring(0, length - 1); // 将符合条件的子串复制给s
  36.                                         }
  37.                                 }
  38.                         }
  39.                 }
  40.                 System.out.println(s);
  41.         }
  42. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1.         public   class Test2
  2.         {
  3.                 public static void splitIt(String str, int byteNum)
  4.                 {
  5.                         byte bt[] = str.getBytes();                //将字符串以字节数组形式存储
  6.                         //字符串中的中文以两个字节元素的形式存在(该数据为负),字母以一个字节元素的形式存在(该数据为正)
  7.                         /*        如果你不懂,可以去掉注释遍历一下该数组
  8.                         for(int i=0;i<bt.length;i++){
  9.                                 System.out.println("bt["+i+"]="+bt[i]);
  10.                         }
  11.                         */
  12.                        
  13.                         if (byteNum >= 1 )                //判断切割位置
  14.                         {
  15.                                 if (bt[byteNum] < 0 )        //当要切开的位置数据为负数,说明要打印的这个数为中文
  16.                                 {                                                //则--byteNum,不要打印该字
  17.                                         String substrx = new String(bt, 0 , -- byteNum);
  18.                                         System.out.println(substrx);
  19.                                 } else                                        //否则为正,即最后一个打印的数据为字母,打印
  20.                                 {
  21.                                         String substrex = new String(bt, 0 ,byteNum);
  22.                                         System.out.println(substrex);
  23.                                 }
  24.                         } else                                       
  25.                         {
  26.                                 System.out.println( " 输入错误!!!请输入大于零的整数: " );
  27.                         }
  28.                 }


  29.                 public   static   void main(String args[])
  30.                 {
  31.                 String str = "HM程j序员" ;
  32.                 int num = 6 ;
  33.                
  34.                 splitIt(str,num);
  35.                 }

  36.                
  37.         }
复制代码


我看了一下网上的代码,改了一下,你有什么不懂的再问我

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
。。这题的关键问题是如何判断是字母还是汉字。
我的思路是:
一个字符串,在某个字节之前都是可用字符,就只判断在这个字节上的字符是不是可用字符就可以了。
首先取出一个字符,看看你要截取的字节中可以包含这个字符么?
      包含就把这个字符放进容器中存储,然后把要截取的字节数减去已经放进容器里的字符的字节数。然后再取下一个字符。
      不包含说明,当前要取的这个字符不是1个字节,不是1个字节那就是2个字节呗,所以当前这个字符就不用存储进容器中。
      在循环外面打印容器里的字符串就可以了。以下是我写的,请参考:
class GetSubStr{
        GetSubStr(String s,int count){
               
                if(s!=null && !("".equals(s))){
                        if (count>0 && count<=s.getBytes().length){
                                getSubString(s,count);

                        }
                        else throw new RuntimeException("字节数输入错误!");
                }
                else throw new RuntimeException("字符串输入错误!");
               
        }

        public void getSubString(String s,int count) {
                int i=0;
                StringBuffer sb=new StringBuffer();
                sb.append("截取"+count+"个字节::");
                while(i<s.length()){
                        Character ch=s.charAt(i++);
                        count=count-ch.toString().getBytes().length;
                        if(count>=0){
                                sb.append(ch);
                               
                        }
                        else break;
                }
                System.out.println(sb.toString());
        }

        public static void main(String[] args){
                for(int i=1;i<=8;i++)
                        {new GetSubStr("HM程序员",i);}
               

        }
}

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

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