• 为字符串数组排序。每个字符串可能包含数字,字母,汉字


    **的要求是我不得不上的动力啊~~~

    具体需求描述:

     1. 中文,按拼音排序,
     2. 如有数字,要解析出来,不能当做字符串 
    按照从左往右的对比。例如
    原素组 :["华星街3号集控器","华星路100号0#箱变","安河路200号","张和顺1号","华星路99号10#箱变","华星路99号2#箱变","1#箱","2#","2#箱变","1#箱变"];
    排序后 :["1#箱", "1#箱变", "2#", "2#箱变", "安河路200号", "华星街3号集控器", "华星路99号2#箱变", "华星路99号10#箱变", "华星路100号0#箱变", "张和顺1号"];
     
    思路:
    想的就是把字符串分解成数组,然后这个数组有点特殊,数字的话就存成 number 类型的一个元素;例如:"华星路99号2#箱变" 会解析成数组 : ["华", "星", "路", 99, "号", 2, "#", "箱", "变"] 。搞成这样就思路更清晰了,都是数字按照数学的大小排序,若不是数组,我使用的是 a.localeCompare(b,'zh-CN') . 这样是汉字按照拼音排序(没有使用大量数据测试,可能出现排序异常哈)
     
    结果:
    基本满足需求,后续如果有特殊情况再来修改!时间,执行完花了 5ms。(虽然我知道一堆for循环很low,可以给我优化建议的~)
     
    以下就上代码:
     
    function sortarr(){
    var arr = ["华星街3号集控器","华星路100号0#箱变","安河路200号","张和顺1号","华星路99号10#箱变","华星路99号2#箱变","1#箱","2#","2#箱变","1#箱变"];
        var temp ='';
        console.log('starttime : ' + (new Date()).getTime())
        
        //冒泡排序
        for(var i=0;i<arr.length-1;i++){
            for(var j=arr.length-1;j>i;j--){
                if(sortstr(arr[j-1],arr[j]) > 0){
                    //返回true;需要交换顺序
                    var temp = arr[j-1];
                    arr[j-1] =arr[j];
                    arr[j] = temp;
                }
            }
         }
         console.log('endtime : ' +(new Date()).getTime())
         return arr;
    }
    
    //将字符串解析成数组
    function dealstrToArr(s){
        var st1 = s.split('');
        var nst1=[];
        var t="";
        for(var i=0;i<st1.length;i++){
            if(isNaN(parseInt(st1[i]))){
                nst1.push(st1[i]);    
            }else{
                t+=st1[i];
                if(isNaN(parseInt(st1[i+1]))){
                    nst1.push(parseInt(t));
                    t="";
                }
            }
        }
        return nst1;
    }
    //s1 < s2 -1; s1>s2 1;
    function sortstr(s1,s2){
        /*
        1. 中文,按拼音排序,
        2. 如有数字,要解析出来,不能当做字符串
        # 
        */
        var as1 = dealstrToArr(s1);
        var as2 = dealstrToArr(s2);
    
        var minlength = as1.length>as2.length ? as2.length : as1.length;
    
        for(var i=0;i<minlength;i++){
            if(as1[i] !== as2[i]){
                if(typeof(as1[i]) == 'number' && typeof(as2[i]) == 'number'){
                    return (as1[i] - as2[i]);        
                }else if(typeof(as1[i]) == 'number' && typeof(as2[i]) != 'number'){
                    return -1;
                }else if(typeof(as1[i]) != 'number' && typeof(as2[i]) == 'number'){
                    return 1;
                }else{
                    return as1[i].localeCompare(as2[i],'zh-CN');
                }
            }
        }
    
        if(i == (minlength-1)){
            return minlength == as1.length ? -1 : 1 ;
        }
    }
  • 相关阅读:
    基于HTML5的可预览多图片Ajax上传
    在linq查询环境下通过sql语句来访问数据库
    EF查询数据库框架的搭建
    用多线程处理后台业务,并提高处理速度
    WPF 大数据加载过程中的等待效果——圆圈转动
    .NET一个线程更新另一个线程的UI(两种实现方法及若干简化)
    通电螺线管与磁场方向
    MOS管与三极管
    word2007怎样从中间某一页开始设置页码
    word删除页眉横线
  • 原文地址:https://www.cnblogs.com/toyocc/p/11208424.html
Copyright © 2020-2023  润新知