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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.itheima;

import java.io.UnsupportedEncodingException;

public class Test10
{

        /**
         * 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
         *       例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
         *      
         * 思路: 1、先将字符串转换为字节数组。
         *      2、定义一个StringBuilder用来接收截取的字符。
         *      3、假设要截取前x个字节,首先将第一个字节转换为字符,如果该字符在[a-zA-Z0-9]的范围内(也可以加进其他符号,
         *         这里只判断是否为字母和数字),则是个完整的字符,用StringBuilder接收这个字符,继续判断下一个字节
         *      4、如果第i个字符不在[a-zA-Z0-9]范围内,那么该字节表示的是半个中文,
         *         判断第i+1个字节所表示的字符是否也不在[a-zA-Z0-9]范围内,如果不在,则i和i+1两个字节表示一个中文
         *         这时要注意i+1是否大于x,如果i+1>x则要舍弃i和i+1这两个字节,否则用StringBuilder接收这个中文,
         *         并使i=i+2,继续判断中文后面的字节
         * @author 史世锋
         * @param args
         */
        public static void main(String[] args)throws Exception
        {
                //定义一个字符串
                String str = "Hello黑马I'm coming";
               
                //截取前8个字节,赋值给str并打印
                str = intercept(str, 8);
                System.out.println(str);
        }
        //定义一个函数,接收被截取的字符串str及要截取的字节数index
        public static String intercept(String str, int index)
        {
                //将字符串转换为字节数组(GBK码表)
                byte[] buff = null;
                try
                {
                        buff = str.getBytes("GBK");
                } catch (UnsupportedEncodingException e)
                {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                }
                //定义一个变量count,用来记录以截取的字符串中中文的个数
                int count = 0;
               
                //定义一个StringBuilder
                StringBuilder sb = new StringBuilder();
               
                //循环判断index前每一个字节
                for(int i = 0; i< index; i++)
                {
                        //判断字节所表示的字符是否在[a-zA-Z0-9]范围内
                        if( (char)buff[i] >= 'A' && (char)buff[i] <='Z'||
                                (char)buff[i] >= 'a' && (char)buff[i] <='z'||
                                (char)buff[i] >= '0' && (char)buff[i] <='9')
                        {

                                //将获取的字符存入StringBuilder
                                sb.append((char)buff[i]);
                        }
                        else
                        {
                                //如果第i个字符不在[a-zA-Z0-9]范围内,判断i+1是否大于index
                                if( (i+1 <index) &&
                                        !((char)buff[i+1] >= 'A' && (char)buff[i+1] <='Z'||
                                          (char)buff[i+1] >= 'a' && (char)buff[i+1] <='z'||
                                          (char)buff[i+1] >= '0' && (char)buff[i+1] <='9'))
                                {
                                        //将获取的中文存入StringBuilder
                                        sb.append(str.charAt(i-count));
                                        count ++;
                                        i++;
                                }
                        }
                }               
                //返回StringBuilder
                return sb.toString();
        }

}

1 个回复

倒序浏览
if判断语句太麻烦了,而且不能判断标点符号等,该怎么改进??
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马