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

x1, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19,x2, x20, 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的资源管理器就按普通的字符排序规则将其排序了。当然几十个百来个条目要判断出来还是很容易的,可是如果是好几千上万的条目,要找出有数字顺序的条目就比较的郁闷了。

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

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

  1. 如何培养青少年的阅读习惯?父母应该从三个方面培养青少年的好兴趣

    很多家长都知道读书很重要,这也是为什么会出现"得语文者得天下"这样的词语.虽然很夸张,但是读书带来很多好处.如何培养孩子这样的兴趣?总的来说,要从三个方面入手. 首先从孩子的兴趣入 ...

  2. 【Go】高效截取字符串

    最近我在 Go Forum 中发现了 [SOLVED] String size of 20 character 的问题,"hollowaykeanho" 给出了相关的答案,而我从中 ...

  3. pta段错误怎么办_语文名师提醒:错误的阅读习惯导致孩子成绩下降

    :点上方↑"小学教育吧"关注更多资讯! 01 错误的阅读习惯导致孩子成绩下降 我们常常提到这样一个话题--孩子的阅读能力决定学习成绩.我们提倡儿童要多阅读,也推送过一些关于儿童阅读 ...

  4. leetcode1528. 重新排列字符串

    给你一个字符串 s 和一个 长度相同 的整数数组 indices . 请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置. 返回重新排列后的字符串. 示例 1: ...

  5. 我的阅读习惯 俞敏洪

    我是一个很喜欢阅读的人,从小就开始读书, 后来有幸进了北京大学,大学四年整个宿舍基本上比的就是谁读了什么书,很少会去比谁找了什么女朋友,因为当时反正也找不着. 非常庆幸我在做公司的过程中,从来没有放弃 ...

  6. 怎样才能让青少年培养起阅读习惯?听听猿辅导这四位嘉宾怎么说

    著名作家毛姆说过:阅读是一座随身携带的避难所.虽然阅读并不能直接告诉我们如何考试.如何生活,但它能让我们看到别人看不到的,想到别人想不到的.为此,让孩子从小培养起好的阅读习惯对孩子未来的发展与成长非常 ...

  7. LeetCode 1528. 重新排列字符串

    给你一个字符串 s 和一个 长度相同 的整数数组 indices . 请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置. 返回重新排列后的字符串. 输入:s = ...

  8. LeetCode之重新排列字符串(五千四百七十二)

    目录 题目 解题 方法一.直接法 方法二.转换法 题目 (原题链接:https://leetcode-cn.com/problems/shuffle-string/) 给你一个字符串 s 和一个 长度 ...

  9. C/C++描述 LeetCode 周赛 5472. 重新排列字符串

    5472. 重新排列字符串   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博 ...

最新文章

  1. window平台下 Eclipse Ndk开发中的Method 'NewStringUTF' could not be resolved问题
  2. SAP中的Currency Converting Factor
  3. python多线程模块_python 多线程模块参考
  4. Microsoft C 运行时库 (CRT) 参考
  5. 107_Power Pivot员工效率监控
  6. 如何使用adb命令安装apk到电视上
  7. 数据元数据字典元数据
  8. 这8款黑科技APP,满足你的所有需求,你想不到的照样帮你实现!
  9. iPhone iPad Cydia 软件源 大全
  10. 机器学习实战-使用matplotlib绘制决策树
  11. java 用户名称中emoji表情包的模糊处理
  12. 《Linux命令行与Shell脚本编程大全第2版.布卢姆》pdf
  13. RK3328 编码H265问题
  14. mac 安装软件 显示信任任何来源
  15. “创新雷神号”卫星成功发射,华为云分布式云原生“天地一体”首次组网成功
  16. 【论文阅读】TomoAlign: A novel approach to correcting sample motion and 3D CTF in CryoET
  17. winform 分页打印实例
  18. 有偏估计、无偏估计、正则条件、克拉美罗下界
  19. 个性化鼠标指针·光标
  20. 谷歌浏览器百度搜索引擎输入后跳转到百度首页并且会吞掉输入内容

热门文章

  1. HTML5本地存储localstorage
  2. 前谷歌工程团队负责人:如何打造一个完美的产品
  3. 汇编中的word ptr
  4. vs开发人员命令查看C++类 data member 内存布局
  5. (转)PWA(Progressive Web App)渐进式Web应用程序
  6. MyBatis第二天
  7. 技术社区,你真的会混吗?
  8. win8和win8.1动态绑定数据到ListView
  9. 绘制业务流程图:流程图绘制工具
  10. golang中的bufio