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

© 支胜勇 中级黑马   /  2014-6-1 23:19  /  1131 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;

import java.awt.List;
import java.util.ArrayList;


/**
* 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
* @author 支胜勇
*
*/
public class Test10 {  
          
                /***
                 * 按字节截取字符串,算法:首先将原字符串中的所有汉字字节放到指定的数组中,
                 * 然后根据要截取的字节数判断最后一个字节是否要截汉字,如果要截汉字,
                 * 则有两种情况。第一中是截取完整的汉字,这种情况下splitlength在hanziByteArr中的序号是偶数的;
                 * 第二种是截取半个汉字,此种情况splitlength在hanziByteArr中的序号是奇数,则此时截取splitlength-1个字节即可;
                 * @param strSrc
                 * @param splitlength
                 */
                public static void splitStr(String strSrc, int splitBytelength) {  
                           
                        int bytelength = 0;  
                  
                        if (strSrc ==null ||strSrc=="") {  
                               
                            System.err.println("字符串不能为空!");  
                            return;  
                        }  
                        
                        byte byteStr[] = strSrc.getBytes(); // 将String转换成byte字节数组
                        
                        //定义存放汉字字节数的变量hanziByteCount,且hanziByteCount为偶数
                       int hanziByteCount=0;
                        
                       //求strSrc中的所有汉字字节数
                       for(int i=0;i<byteStr.length;i++){
                                if(byteStr[i] < 0){
                                        hanziByteCount++;
                                }
                        }
                        
                        //定义存放strSrc中的所有汉字字节的数组
                        byte hanziByteArr[]=new byte[hanziByteCount];
                        
                        //重置变量hanziByteCount
                        hanziByteCount=0;
                        
                        //将strSrc中的所有汉字字节放到数组hanziByteArr中
                        for(int i=0;i<byteStr.length;i++){
                                if(byteStr[i] < 0){
                                        hanziByteArr[hanziByteCount]=(byteStr[i]);
                                        hanziByteCount++;
                                }
                        }
                        
                        
                        bytelength = byteStr.length;  
                        String subStr="";
                        
                        if (splitBytelength >= bytelength)
                        {//全部截完  
                               
                            subStr = new String(byteStr, 0, bytelength);
                           
                        }else
                        {  
                                // 判断是否截汉字字节,如果是的话字节对应的ASCII码是小于0的值  ,因为汉字的ASCII最高位也就是符号位小于零
                                if (byteStr[splitBytelength-1] < 0) {//判断要截取的最后一个字节是否包含汉字
                                       
                                        //定义要截取的汉字字节在hanziByteArr中的位置
                                        int hanziPosition=0;
                                       
                                        for(int i=0;i<hanziByteArr.length;i++){
                                                if(byteStr[splitBytelength-1]==hanziByteArr[i]){
                                                        //数组的下标是从零开始的,所以要加1
                                                        hanziPosition=i+1;
                                                        break;
                                                }
                                        }
                                       
                                        if(hanziPosition%2==0){//如果要截取的汉字字节位置在hanziByteArr中的序号是偶数,则截取的是完整的汉字,否则是截半
                                                subStr = new String(byteStr, 0, splitBytelength);
                                        }else{
                                                subStr = new String(byteStr, 0, splitBytelength-1);
                                        }
                                       
                                     
                                } else {  
                                        System.out.print(byteStr[splitBytelength]);
                                    subStr = new String(byteStr, 0, splitBytelength);
                                }  
                        }
                        
                        System.out.print("您从“"+strSrc+"”中按"+splitBytelength+"个字节截取的字符串是:"+subStr+";\r\n");
                    }  
       
               
                        /***
                         * 程序入口
                         * @param args
                         */
                    public static void main(String[] args) {  
                           
                            //定义两个测试字符串
                        String testStr1 = "zhisy黑马程g序员的理想2014";  
                        String testStr2 = "test@黑马训练f营-支胜勇";  
                        
                        //调用splitStr(String ,int )来获取结果
                        splitStr(testStr1, 25);  
                        splitStr(testStr2, 14);  
                        
                    }  
  
   
  
}

0 个回复

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