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

简介:

   对于字符串的排序,我们知道是比较相同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()方法,可以高效的排列字符串。可是美中不足的是这个方法排序后的结果就是上面的第一种情况,完全不符合我们的阅读习惯:(。

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

None.gif function SortStringArray(ary)
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif     var args = [];
InBlock.gif     var len = 0 ;
InBlock.gif     for (  var i = 0 ; i < ary.length ; ++ i )
ExpandedSubBlockStart.gif ContractedSubBlock.gif     dot.gif{
InBlock.gif        len = ary[i].length;
InBlock.gif         //  len = new String(i).valueOf().length;
InBlock.gif
         if ( ! args[len] )
ExpandedSubBlockStart.gif ContractedSubBlock.gif         dot.gif{
InBlock.gif            args[len] = [];
ExpandedSubBlockEnd.gif        }
InBlock.gif        args[len].push(ary[i]);
ExpandedSubBlockEnd.gif    }
InBlock.gif     var sortedArray = [];
InBlock.gif     for (  var j = 0 ; j <= args.length ; ++ j )
ExpandedSubBlockStart.gif ContractedSubBlock.gif     dot.gif{
InBlock.gif         if ( args[j] )
ExpandedSubBlockStart.gif ContractedSubBlock.gif         dot.gif{
InBlock.gif            args[j].sort();
InBlock.gif            sortedArray = sortedArray.concat(args[j]);
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
InBlock.gif     return sortedArray;
ExpandedBlockEnd.gif}

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

None.gif var ary = [];
None.gif var count = 10000 ;
None.gif for (  var i = 0 ; i < count ; ++i )
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif     var item = 'xxxxxxxxx' + (count-i);
InBlock.gif    ary.push(item);
ExpandedBlockEnd.gif}
None.gifary.sort();
None.gifdtBegin =  new Date();
None.gifary = SortStringArray(ary);
None.gifalert( new Date()-dtBegin); 


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


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

目录
相关文章
|
4月前
|
XML JavaScript 前端开发
使用 doscify 将文章写成文档一般丝滑
使用 doscify 将文章写成文档一般丝滑
56 0
|
7月前
|
前端开发 JavaScript Java
内容管理-易错重难点
项目的模块架构理解 在我们做项目之前首先要对项目的模块结构有一个基本的了解,放一张我做的结构图: 注意点: 我们将依赖版本管理和依赖管理分为两个工程,而不是放在一个工程中,这样的话可以子模块可以选择性的继承,而不会太重 parent工程:对整个项目的依赖包版本进行管理 base工程:提供基础类库、工具类库等(继承parent工程,从而也纳入版本管理) content工程是一个聚合工程,不需要依赖,所以我们让它继承于parent工程拿到依赖版本即可 在content微服务工程中,我们可以发现api工程和service工程都依赖于model工程,那么我们就不需要让api、service、m
21 0
|
10月前
|
程序员
相见恨晚的Matlab编程小技巧(2)-代码怎么做到逻辑清晰?——巧用注释符“%“
        本文将以教程的形式详细介绍Matlab中两个常用符号“%”和“%%”的作用。初学者可以通过此文掌握这两个符号的用法,为Matlab编程打下坚实的基础。
|
11月前
|
机器学习/深度学习 搜索推荐 算法
编程艺术 - 第二章 、俩个字符串是否包含问题以及扩展
编程艺术 - 第二章 、俩个字符串是否包含问题以及扩展
47 0
|
11月前
|
运维 Shell
善用chatGPT学习 | bash脚本如何判断字符串在数组中
善用chatGPT学习 | bash脚本如何判断字符串在数组中
150 0
|
数据库
【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记
您好,我是码农飞哥,一直想飞暂时在跑个那个老哥。
212 0
【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
60 0
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
|
Python
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(2)
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(2)
170 0
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(2)
|
移动开发 Python
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(1)
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(1)
287 0
Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)(1)
Markdown 额外语法支持-印象笔记
下划线 <u>支持下滑线了</u> 添加待办事项 语法示例: 三只青蛙 * [x] 第一只青蛙 * [ ] 第二只青蛙 * [ ] 第三只青蛙 插入表格 语法示例: | 帐户类型 | 免费帐户 | 标准帐户 | 高级帐户 | | --- | --- | --- | --- | | 帐户流量 | 60M | 1GB | 10GB | | 设备数目 | 2台 | 无限制 | 无限制 | | 当前价格 | 免费 | ¥8.17/月 | ¥12.33/月| 插入图表 目前支持饼状图、折线图、柱状图和条形图,只需将 type 改为对应的pie、line、column 和 bar。 ,预算,收
145 0
Markdown 额外语法支持-印象笔记