按阅读习惯来高效排列字符串的脚本
? ?對(duì)于字符串的排序,我們知道是比較相同index位置的字符的值來進(jìn)行的。這樣的排序有個(gè)問題,就是當(dāng)被排序的字符串的內(nèi)容是有數(shù)字順序的,而且還不等長就比較的郁悶了。我們?cè)趚p以前的操作系統(tǒng)的資源管理器里,就會(huì)常??吹竭@樣的文件名序列:
??? x1, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19,x2,?x20, x21, x22...
??? 而我們的閱讀習(xí)慣因該是這樣的:
??? x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17...
??? 如果是排列數(shù)字,按這種閱讀習(xí)慣是理所當(dāng)然的事情。可是對(duì)于字符串似乎就變得有些麻煩了,對(duì)于JScript腳本,系統(tǒng)提供了Array.sort()方法,可以高效的排列字符串??墒敲乐胁蛔愕氖沁@個(gè)方法排序后的結(jié)果就是上面的第一種情況,完全不符合我們的閱讀習(xí)慣:(。
??? 于是我們考慮使用分段排序的方式解決這個(gè)問題,代碼如下:
{
????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個(gè)字符串節(jié)點(diǎn)按閱讀習(xí)慣排序所花的時(shí)間是281ms! 測(cè)試代碼如下:
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);?
??? 后話:如果我們已知被排序的字符串是數(shù)字順序的,那么用我們的SortStringArray()排序就行了,但是要去識(shí)別那些字符串是可以按數(shù)字順序排列的,我想了想好像還很困難??纯聪旅孢@個(gè)xp的資源管理器的示例就清楚了:
????
??? 紅框里的文件的文件名就是沒有數(shù)字順序的,而xp的資源管理器就按普通的字符排序規(guī)則將其排序了。當(dāng)然幾十個(gè)百來個(gè)條目要判斷出來還是很容易的,可是如果是好幾千上萬的條目,要找出有數(shù)字順序的條目就比較的郁悶了。
本文轉(zhuǎn)自博客園鳥食軒的博客,原文鏈接:http://www.cnblogs.com/birdshome/,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原博主。
總結(jié)
以上是生活随笔為你收集整理的按阅读习惯来高效排列字符串的脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创建对象的多种方式
- 下一篇: Android之TableLayout表