按阅读习惯来高效排列字符串的脚本

简介:

   对于字符串的排序,我们知道是比较相同index位置的字符的值来进行的。这样的排序有个问题,就是当被排序的字符串的内容是有数字顺序的,而且还不等长就比较的郁闷了。我们在xp以前的操作系统的资源管理器里,就会常常看到这样的文件名序列:

    x1, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19,x2x20, x21, x22...

    而我们的阅读习惯因该是这样的:

    x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17...

    如果是排列数字,按这种阅读习惯是理所当然的事情。可是对于字符串似乎就变得有些麻烦了,对于JScript脚本,系统提供了Array.sort()方法,可以高效的排列字符串。可是美中不足的是这个方法排序后的结果就是上面的第一种情况,完全不符合我们的阅读习惯:(。

    于是我们考虑使用分段排序的方式解决这个问题,代码如下:

function SortStringArray(ary)
{
     var args = [];
     var len = 0 ;
     for (  var i = 0 ; i < ary.length ; ++ i )
     {
        len = ary[i].length;
         //  len = new String(i).valueOf().length;
         if ( ! args[len] )
         {
            args[len] = [];
        }
        args[len].push(ary[i]);
    }
     var sortedArray = [];
     for (  var j = 0 ; j <= args.length ; ++ j )
     {
         if ( args[j] )
         {
            args[j].sort();
            sortedArray = sortedArray.concat(args[j]);
        }
    }
     return sortedArray;
}

    由于使用了Array.sort()方法,排序效率非常高。10,000个字符串节点按阅读习惯排序所花的时间是281ms! 测试代码如下:

var ary = [];
var count = 10000 ;
for (  var i = 0 ; i < count ; ++i )
{
     var item = 'xxxxxxxxx' + (count-i);
    ary.push(item);
}
ary.sort();
dtBegin =  new Date();
ary = SortStringArray(ary);
alert( new Date()-dtBegin); 


    后话:如果我们已知被排序的字符串是数字顺序的,那么用我们的SortStringArray()排序就行了,但是要去识别那些字符串是可以按数字顺序排列的,我想了想好像还很困难。看看下面这个xp的资源管理器的示例就清楚了:
    XP.Explorer.Sort.png
    红框里的文件的文件名就是没有数字顺序的,而xp的资源管理器就按普通的字符排序规则将其排序了。当然几十个百来个条目要判断出来还是很容易的,可是如果是好几千上万的条目,要找出有数字顺序的条目就比较的郁闷了。


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
1月前
|
小程序 Linux Python
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
|
6月前
|
IDE 开发工具 开发者
Python函数说明文档:编写清晰易懂的文档字符串
Python函数说明文档:编写清晰易懂的文档字符串
89 1
|
6月前
|
XML JavaScript 前端开发
使用 doscify 将文章写成文档一般丝滑
使用 doscify 将文章写成文档一般丝滑
124 0
|
Python
Python编程 字符串组成方式
Python编程 字符串组成方式
80 0
|
程序员
相见恨晚的Matlab编程小技巧(2)-代码怎么做到逻辑清晰?——巧用注释符“%“
        本文将以教程的形式详细介绍Matlab中两个常用符号“%”和“%%”的作用。初学者可以通过此文掌握这两个符号的用法,为Matlab编程打下坚实的基础。
|
机器学习/深度学习 搜索推荐 算法
编程艺术 - 第二章 、俩个字符串是否包含问题以及扩展
编程艺术 - 第二章 、俩个字符串是否包含问题以及扩展
67 0
|
运维 Shell
善用chatGPT学习 | bash脚本如何判断字符串在数组中
善用chatGPT学习 | bash脚本如何判断字符串在数组中
197 0
|
数据库
【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记
您好,我是码农飞哥,一直想飞暂时在跑个那个老哥。
259 0
【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
82 0
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
|
Python
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(2)
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(2)
205 0
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(2)
下一篇
无影云桌面