文档章节

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

j
 jdzyh
发布于 2017/02/28 09:13
字数 566
阅读 4
收藏 0
点赞 0
评论 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

解决分割中文时出乱码的方法 mb_substr() or mb_strcut

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

kobe52099 ⋅ 2014/01/13 ⋅ 0

Java中byte与16进制字符串的互相转换

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

毛朱 ⋅ 2013/12/09 ⋅ 0

Java中byte与16进制字符串的互相转换

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

zhangyujsj ⋅ 2013/11/26 ⋅ 1

solr:关于spell的优化效果

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

momoHuang ⋅ 2013/08/30 ⋅ 0

【C++】第5章 循环和关系表达式 知识总结

《C++ Primer Plus》第5章知识点总结 for循环 for(initialization; test-expression; update-expression) body 语句:age = 100; 表达式:age = 100 对于 for( int i=0 ;i<5 ;i++),这种语句......

qq_37792173 ⋅ 2017/09/26 ⋅ 0

Java学习第二天变量、常量和运算符

今天学习内容如下: 1、字面量和常量 2、引出变量 3、变量分类、作用域和使用规则 4、数据类型和分类 5、boolean类型 6、整数类型 7、小数类型 8、字符类型 9、最常用的引用类型 10、数据过大...

博行天下 ⋅ 2017/11/28 ⋅ 0

java的常量、变量及相关知识

今天付老师给我们说了java基础的第二课。主要说了很多常量、变量、进制转换和码表方面的内容。传智的老师果然还是很牛啊,一些以前看书不能看懂的问题一看就了解了。 常量(Constant),就是恒...

emiykurosite ⋅ 2012/03/29 ⋅ 0

shell基础(下) 特殊符号

Linux shell中的特殊符号 一 cut命令 cut命令: 截取某一个字段。 格式:cut -d ‘分隔符’ [-cf] n , n指数字。 有如下选项: -d : 后跟分隔符。 -c: 后面接第几个字符 -f: 后接第几个区块 ...

流逝将军 ⋅ 01/13 ⋅ 0

6. Java 中的基本数据类型 【连载 6】

数据类型定义了变量可以采用的值,例如,定义变量为 类型,则只能取整数值。 在 Java 中有两类数据类型: 1)原始数据类型 2)非原始数据类型 - 数组和字符串是非原始数据类型,将在以后的教...

密叔 ⋅ 01/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hive函数

1.函数explode (一转多) create table hive_wc(sentence string); load data local inpath '/home/hadoop/data/hive-wc.txt' into table hive_wc; 结果: hive > select * from hive_wc; ......

GordonNemo ⋅ 27分钟前 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 44分钟前 ⋅ 0

使用Java connector消费ABAP系统的函数

Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDIS_GET_UPSELL_MATERIALS,输入一个customer ID和product ID,会输......

JerryWang_SAP ⋅ 49分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部