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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 16463535 中级黑马   /  2013-4-13 10:35  /  1486 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 16463535 于 2013-4-18 13:05 编辑

编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”.
public static void main(String[] args)
{
  ;// TODO Auto-generated method stub
  String str = "我ABC汉DEF民JQK";    //定义一个需要截取的字符串
  String strOk = mySubString(str,6);//定义一个接收mySubString()返回值的字符串
  System.out.println(strOk);
  
}
public static String mySubString(String str,int subByte) //为了调用方便方法暂时定义为静态的。
{                                                        //String str:需要截取的字符串,int subByte:要截取的字节数
  if(str.equals(""))               //判断字符串是否为"",如果为"",方法毫无意义,直接返回
  {
    return "请输入您要截取的原字符串";
  }
  if(str.length()<2)               //判断字符串长度是否过小,容易效果不明显。或者字节数超出原字符串长度导致原字符串输出。
  {
    System.out.println("友情提示:输入的符串长度过短,本程序继续运行,如果效果不明显,调整参数后再运行");
  }
  if(subByte<2)      //判断字节数是否过小,容易出现字符串第一位为汉字时,没有运行结果。
  {
    System.out.println("友情提示:输入的字节数过少,本程序继续运行,很容易出现没有效果的情况,希望调整参数后再运行");
  }

  StringBuilder sb = new StringBuilder();//创建字符串缓冲区
  int strbytes = 0;                      //创建一个记录新字符串字节总数的变量
  String strSub = null;                  //创建一个记录原字符串中单个字符的变量
  for(int x=0; x<str.length(); x++)    //判断和赋值的次数不确定所以用循环
  {
    strSub = str.substring(x,x+1);    //顺序取出原字符串一个字符
    int strByte = 0;                   //定义一个记录原字符串单个字符的字节数的变量。记录一次使用后,即可归零。所以定义在这里。
    strByte = strSub.getBytes().length;//获取单个字符占用的字节数,用strByte记录。
    strbytes = strbytes+strByte;    //将新字符串的字节数相加,用于以下判断  
   if(strbytes==subByte)              //判断累加的字节数是否与要截取的字节数相等
   {
       sb.append(strSub);             //如果相等,将strSub追加到StringBuilder中
       return sb.toString();     //将 StringBuilder 进行 toString()返回
   }
   if(strbytes<subByte)               //判断累加的字节数是否小于subByte
   {
        sb.append(strSub);      //如果小于,继续将strSub追加到StringBuilder中
   }
   if(strbytes>subByte)               //判断累加的字节数是否超过了指定要截取的字节数
   {
        return sb.toString();     //如果超过了,那么直接将现有的 StringBuilder 进行 toString()返回
                                   //因为当strbytes==subByte的时候,正是需要截取的字节数,
                                   //如果strbytes>subByte时,那么最后要追加的这个字符一定占用了1个以上的字节,才导致strbytes>subByte
                                   //本题只涉及到了字母和中文,按照本题的要求,绝对不能截取出中文的一半
   }
  }
     //当输入的字节数大于了原字符串字节数的总和时,for(int x=0; x<str.length(); x++)将在str.length()后停下,StringBuilder中还是原字符串。
    return "您输入的字节数大于原字符串字节数的总和,将原字符串输出如下\r\n"+sb.toString();
}
}

求高手指点,这样做是否妥当?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马