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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.util.ArrayList;
import java.util.List;
/*
* 10、编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
*
*/
public class Test10 {
/*
  * 首先考虑的是奇数-1 但是发现前面是三个字符的话 不对
  * 解题思路:将字符串转换为字节数组
  *         遍历判断需要-1的脚标
  *         查看脚标是否需要减一
  *
  */
public static void main(String[] args) {
  System.out.println(subMethod("HM程序员", 2));
  System.out.println(subMethod("HM程序员", 3));
  System.out.println(subMethod("HM程序员", 4));
  System.out.println(subMethod("HMD李雄", 5));
  System.out.println(subMethod("HM李雄",0));
}
private static String subMethod(String str, int subIndex) {
  // TODO Auto-generated method stub
  //将字符串转换为字节数组
  byte[] bytes = str.getBytes();
  //创建list对象 存储不会出现半个汉字的角标
  List<Integer> list = new ArrayList<Integer>();
  for (int i = 0; i < bytes.length; i++) {
   //如果bytes[i]<0说明是个汉字 i+1
   if(bytes[i]<0)
    list.add(++i);
   else
    list.add(i);
  }
//  System.out.println(list);
  //判断输入的截取数
  //如果截取数>bytes.length 返回原字符串
  if(subIndex>0){
   if(subIndex>bytes.length){
    return str;
   } else {
    //如果输入角标位置(subIndex-1)存在于list内直接截取
    if(list.contains(subIndex-1)){
     return new String(bytes,0,subIndex);
    } else {
     //不存在-1截取
     return new String(bytes,0,subIndex-1);
    }
   }
  }else{
   throw new RuntimeException("请输入大于0的数");
  }
}
}

2 个回复

倒序浏览
  1. package com.itheima;

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

  8. public class Test10 {
  9.         public static void main(String[] args){
  10.                 //System.out.println(getSubString("HM程序员",0));
  11.                 System.out.println(getSubString("HM程序员",2));
  12.                 System.out.println(getSubString("HM程序员",3));
  13.                 System.out.println(getSubString("HM程序员",4));
  14.                 System.out.println(getSubString("HM程序员",5));
  15.                 System.out.println(getSubString("HM程序员",6));
  16.                 System.out.println(getSubString("HM程序员",7));
  17.                 System.out.println(getSubString("HM程序员",8));
  18.                 System.out.println(getSubString("HM程序员",9));
  19.         }
  20.        
  21.        
  22.         public static String getSubString(String str, int num){
  23.                 byte[] b = null;
  24.                
  25.                 try {
  26.                         b = str.getBytes("GBK");//指定GBK编码,并处理异常。
  27.                 } catch (UnsupportedEncodingException e) {
  28.                         e.printStackTrace();
  29.                 }
  30.                
  31.                 if(num>b.length){//如果截取值num大于字符串b长度,则返回整个字符串str。
  32.                         return str;
  33.                 }else if(num<=0){//如果截取值num<=0,则抛出运行时异常。
  34.                         throw new RuntimeException("截取值num必须为大于0的整数。");
  35.                 }else if(num%2==1 && (byte)b[num-1]<0){//如果截取值num是奇数,并且最后一个字节是汉字的一半,则少输出一个字节。
  36.                         /*
  37.                          * 原理:GBK编码表中,汉字由2字节表示,且2个字节前的最高位都是1,
  38.                          * 在byte类型中,最高位1代表负数。
  39.                          * 所以只要(byte)b[num-1]<0,就说明最后一个字节是汉字的一半。
  40.                          * */
  41.                         num--;
  42.                 }
  43.                                
  44.                 //截取得到新字节数组。
  45.                 byte[] newb=new byte[num];
  46.         for(int x=0;x<num;x++){
  47.                 newb[x]=b[x];
  48.         }
  49.         
  50.         //將字符转回字符串。
  51.         String newStr=new String(newb);
  52.         
  53.         return newStr;
  54.         }
  55. }
复制代码


回复 使用道具 举报

你这种思考仅仅是面向老师给出的字符串"HM程序员"的方法
如果给定的字符串是"HM程X序员",你的程序就会读出半个汉字的

这是运行结果!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马