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

本文介绍了一种改进的字符串排序方法,特别适用于包含数字的字符串序列。通过分段排序技术,可以实现更符合人类直觉的排序效果,提高用户体验。

    对于字符串的排序,我们知道是比较相同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.giffunction SortStringArray(ary)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
var args = [];
InBlock.gif    
var len = 0 ;
InBlock.gif    
for ( var i = 0 ; i < ary.length ; ++ i )
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        len 
= ary[i].length;
InBlock.gif        
// len = new String(i).valueOf().length;
InBlock.gif
        if ( ! args[len] )
ExpandedSubBlockStart.gifContractedSubBlock.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.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if ( args[j] )
ExpandedSubBlockStart.gifContractedSubBlock.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.gifvar ary = [];
None.gif
var count = 10000 ;
None.gif
for ( var i = 0 ; i < count ; ++i )
ExpandedBlockStart.gifContractedBlock.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的资源管理器就按普通的字符排序规则将其排序了。当然几十个百来个条目要判断出来还是很容易的,可是如果是好几千上万的条目,要找出有数字顺序的条目就比较的郁闷了。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值