JAVA如何进行高效的进行字符串拆分

题目:

如何最高效率最快的按空格进行拆分如下字符串,获得最长非空字符串的长度!

“aaaa ccsdf we iii ldkjl eee”
** 备注:有说用逗号隔开的字符串,或者别的什么隔开的字符串等等,都一样。**

参赛选手介绍:

1号选手split 号称史上最慢,来自java.lang.String家族,但用着就是香!真香
2号选手StringTokenier来自java.util家族,皇室血统,公认很快!真的快吗?
3号选手来自草根无名无姓,暂时叫EsayMethod,我自己想的也不是啥算法,思想是一次遍历出结果,时间复杂度O(n)!
本次实验需要拆分字符串长度为540000便于计算时间。
实际是aa bc aaaa aaa dd eeee hhhhhhhi www wee rrr rrr 33333 这样字符串循环拼接一万次。

一、 用split (** 结果-三次平均:44.6666**)

    /**
     * 方法一 split拆分遍历法
     * 被人吐槽慢,咱今天就试试到底真慢假慢
     * @param msg
     * @return
     */
    public static int splitMethod (String msg) {
        String[] strArr = msg.split(" ");
        for (String str : strArr) {
            lastNum = str.length();
            if(lastNum > maxNum) {
                maxNum =lastNum;
            }
        }
        return maxNum;
    }

实验第一次用时38

一

实验第二次用时48

二

实验第三次用时48

在这里插入图片描述

二、用StringTokenizer(** 结果-三次平均:31.3333**)

    /**
     * 方法二 StringTokenizer
     * 网上传说拆分字符串很快
     * @param msg
     * @return
     */
    public static int stringTokenizerMethod (String msg) {
        StringTokenizer stringTokenizer = new StringTokenizer(msg," ");
        while (stringTokenizer.hasMoreElements()) {
           lastNum = stringTokenizer.nextElement().toString().length();
           if ( lastNum > maxNum ) {
               maxNum = lastNum;
           }
        }
        return maxNum;
    }

实验第一次用时32

一

实验第二次用时26

二

实验第三次用时36

三

三、直接拆成字节数组,然后循环判断取最长(** 结果-三次平均:8.6666**)

   /**
     * 方法三 将字符串拆分成字节数组,遍历比大小
     * 暂时咱们给他起名叫Esay方法
     * @param msg
     * @return
     */
    public static int esayMethod (String msg) {
        char[] newChar = msg.toString().toCharArray();
        for(int i = 0;newChar.length >i; i++){
            lastNum = i - beginNum;
            if(newChar[i] == ' ' ){
                if(lastNum != 0){
                    if(lastNum > maxNum){
                        maxNum =lastNum;
                    }
                    beginNum = i;
                }
            }
        }
        return maxNum-1;
    }

实验第一次用时10
一
实验第二次用时8
二
实验第三次用时8
三

执行代码如下:

    private static int maxNum = 0;
    private static int beginNum = 0;
    private static int lastNum = 0;
    
    public static void main(String[] args) {
        String str ="aa bc tttt aaa dd eeee hhhhhhhi www wee rrr rrr 33333 ";
        StringBuffer sb = new StringBuffer();
        for (int n = 0 ;n <10000 ; n++){
            sb.append(str);
        }
        String msg = sb.toString();
        System.out.println("开始:"+System.currentTimeMillis());
//        System.out.println(splitMethod(msg));
        System.out.println(esayMethod(msg));
//        System.out.println(stringTokenizerMethod(msg));
        System.out.println("结束:"+System.currentTimeMillis());
    }

总结:

小伙伴们,有更好的参赛选手请留言啊!定会更新!
草根完胜两位高手
有更好算法的请留言,一起讨论,一起进步!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值