文档章节

根据字符数/Byte数切分字符串

j
 jdzyh
发布于 2017/02/28 09:13
字数 566
阅读 4
收藏 0
/**
     * 按照长度拆分字符串(若分段小于segment个,则填充""至数组),取实际段数与默认段数较大的作为返回的数量
     * @param srcString
     * @param seg_and_len [默认段数;每段长度;是否按byte划分], 默认为[20;3800;1];第三位默认为1,表示按照byte划分.
     * @return 
     */
    public static List<String> splitXmlString(String srcString, int... seg_and_len){
        List<String> retList = new ArrayList<String>();
        
        int _SEGMENT = 20;
        int _LEN = 3800;
        
        int default_segment = _SEGMENT;
        int field_len = _LEN;
        int isSplitByByte = 1;
        
        //检验每段长度的数值
        if(seg_and_len.length==0){
            default_segment = _SEGMENT;
            field_len = _LEN;
            isSplitByByte = 1;
            
        }else if(seg_and_len.length==1) {//仅有默认段数
            default_segment = (seg_and_len[0]>_SEGMENT) ? seg_and_len[0] : _SEGMENT;
            field_len = _LEN;
            isSplitByByte = 1;
            
        }else if(seg_and_len.length==2) {//有默认段数与每段长度
            default_segment = (seg_and_len[0]>_SEGMENT) ? seg_and_len[0] : _SEGMENT;
            field_len = (seg_and_len[1]>0) ? seg_and_len[1] : _LEN;
            isSplitByByte = 1;
            
        }else if(seg_and_len.length==3) {//有默认段数、每段长度
            default_segment = (seg_and_len[0]>_SEGMENT) ? seg_and_len[0] : _SEGMENT;
            field_len = (seg_and_len[1]>0) ? seg_and_len[1] : _LEN;
            isSplitByByte = (seg_and_len[2]==0) ? seg_and_len[2] : 1;
            
        }
        
        //检验输入字符串
        if(null==srcString||srcString.equals("")){
            for(int i=0;i<default_segment;i++){ //当输入没有的时候,返回default_segment个空字符串对象
                retList.add(i,"");
            }
            return retList;
        }
        
        switch(isSplitByByte){
            case 0://按照字符数划分
                //实际应分段数
                int relSegment = (int) Math.ceil( (double)srcString.length()/field_len );

                //检验分段数
                int seg_limit = (default_segment > relSegment) ? default_segment:relSegment;
                
                for(int i=0;i<relSegment;i++){
                    if(i!=relSegment-1) {
                        retList.add( srcString.substring(i*field_len, i*field_len+field_len) );
                    }else{ //对实际分段的最后一段,填充剩下的所有字符串.
                        retList.add( srcString.substring(i*field_len, srcString.length()) );
                    }
                }
                //若分段小于seg_limit个,则填充""至数组
                for(int i=relSegment;i<seg_limit;i++){
                    retList.add(i,"");
                }
                break;
                
            case 1://按照byte数划分
                retList = subStringSplitByByte(srcString, field_len);
                int rel_size = (null==retList||retList.isEmpty())? 0 : retList.size();
                
                if(rel_size < default_segment) {
                    for(int i=rel_size;i<default_segment;i++){
                        retList.add(i,"");
                    }
                }
                
                break;
                
            default:
                break;
        }       
        
        
        return retList;
    }
    /**
     * 根据字节长度长度len, 分割字符串src,
     * @param src
     * @param byte_len
     * @return  由于中文的原因,返回的字符串数组,每组至多byte_len为字节.
     */
    public static List<String> subStringSplitByByte(String src ,int byte_len){
        List<String> retList = new ArrayList<String>();
        
        if(null==src||src.isEmpty()){
            return retList;
        }
        if(byte_len < 2) byte_len=src.length();
        
        try {
            byte[] bytes = src.getBytes("gbk");
            
            int hanzi_cnt = 0;
            int pos = 0;
            int l_s = 0;
            int r_s = 0;
              
            for(int i=0;i<bytes.length;i++){
                if(bytes[i]<0) {
                    hanzi_cnt++;
                    r_s += 1;
                }else {
                    r_s += 2;
                }
                
                if( (i+1-pos) % byte_len==0) {        
                    if(hanzi_cnt==0 || hanzi_cnt%2==0 ){
                        retList.add(src.substring(l_s/2, r_s/2 ));
                        pos = i+1;
                        hanzi_cnt = 0;
                        l_s = r_s;
                        continue;
                    
                    }else{ // hanzi_cnt%2==1
                        retList.add(src.substring(l_s/2, r_s/2));
                        pos = i;
                        hanzi_cnt = 1;
                        l_s = r_s;
                        continue;
                    }             
                }
                
            }
            if(l_s/2 < src.length()){
                retList.add(src.substring(l_s/2, src.length() ));
            }
            
            
        } catch (UnsupportedEncodingException e) {
            logger.error("", e);
        }
        
        
        return retList;
    }

 

© 著作权归作者所有

共有 人打赏支持
j
粉丝 0
博文 2
码字总数 891
作品 0
浦东
程序员
PHP中substr() mb_substr() mb_struct()的区别和用法及Smar...

PHP substr(),mbsubstr()及mbstrcut的区别和用法及Smarty模板中的truncate调节器浅谈 PHP substr() 函数可以 分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mbsubstr(...

sco
2012/10/07
0
0
从JDK源码看String(下)

lastIndexOf方法 该方法用于返回指定字符在此字符串中最后一次出现处的索引,有多种方法参数。可传入 int 类型,也可传入 String 类型,另外还能传入开始位置。根据编码的不同分别用 Latin1...

超人汪小建
08/13
0
0
解决分割中文时出乱码的方法 mb_substr() or mb_strcut

原因:字符编码的问题,GB2312中文占两个字符,utf-8中文占3个字符,分割的时候要看中文字符是否结束,否则久乱码 解决方法: PHP substr()函数可以 分割文字,但要分割的文字如果包括中文字...

kobe52099
2014/01/13
0
0
Java中byte与16进制字符串的互相转换

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和...

毛朱
2013/12/09
0
0
solr:关于spell的优化效果

一、lucene里边,有三个算法去计算拼写纠错的相似度。 1、Edit Distance(编辑距离) 算法原理:从一个字符串A经过增删改的步数,变成另外一个字符串B,这个步数最少的时候,就是为A与B之前的...

momoHuang
2013/08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arcgis jsapi接口入门系列:总览

开发环境: arcgis jsapi版本4.9 由于我们这套代码是基于vue,webpack开发的,会有少数vue代码,但总体不影响 里面还有些我们公司的js库和html css,给出的代码不能百分百直接运行,主要还是...

canneljls
20分钟前
1
0
月薪80k阿里架构师漫谈他是如何从一名小码农走到架构师的

01 刚当程序员时,我是属于那种勤勤恳恳类型的员工,工作态度用认真来形容不为过,每天我几乎是团队里最早到公司,又最晚下班的一个。而组员张工一般情况下都是准时上下班的,即使项目进度比...

Java填坑之路
23分钟前
1
0
oracle的resetlogs机制浅析

oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用? 它的原理机制是什么?他都起哪些作用? 我...

突突突酱
24分钟前
1
0
JAVA 获取两个日期间的所有日期

public static List<String> getDates(String startDate, String endDate){ List<String> dates = new ArrayList<>(); try { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Dat......

尘叙缘
31分钟前
2
0
Innodb中的事务隔离级别和锁的关系

#一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。...

Skqing
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部