2011-12-27 65 views
0

我尝试了一些我在SO上找到的正则表达式排序,但我认为它们可能不喜欢流中的+符号进行排序。 所以我得到看起来像这样的(3至30个字母“+” 0到64000号)当数字相同时,保留字母顺序的流的数字排序

userString = "AAA+800|BBB+700|CCC+600|ZZZ+500|YYY+400|XXX+300|XXA+300|XXZ+300"; 

输出需要在格式的数据流:

array[0] = "XXA+300" // 300 being the lowest num and XXA being before XXX 
array[...] 
array[7] = "AAA+800" 

我希望从最低的数字到最高的数字进行排序并反转。 这是我低效的代码。循环8x8次。 (我的流可能有200个项目)

它可以工作,但看起来很乱。有人可以帮我改进它,所以它使用更少的迭代?

var array = userString.split('|'); 

array.sort(); 

for(var i=0; i<len; i++) {   // array2 contains just the numbers 
    bits = array[i].split('+'); 
    array2[i] = bits[1]; 
} 

array2.sort(); 
if(sort_order==2) 
    array2.reverse(); 

var c=0; 
for(var a=0;a<len;a++) {   // loop for creating array3 (the output) 
    for(var i=0; i<len ; i++) {  // loop thru array to find matching score 
     bits = array[i].split('+'); 
     if(bits[1] == array2[a]) { // found matching score 
      array3[c++] = bits[0]+'+'+bits[1]; // add to array3 
      array[i]='z+z';  // so cant rematch array position 
     } 
    } 
} 
array = array3; 

亲切的问候

回答

0

请原谅简洁的答案(和缺乏测试),因为我在iPhone上打字。

var userArr = userString.split('|'); 

userArr.sort(function(a, b) { 
    var aArr = a.split('+'), 
     bArr = b.split('+'), 
     aLetters = aArr[0], 
     bLetters = bArr[0], 
     aNumbers = parseInt(aArr[1]), 
     bNumbers = parseInt(bArr[1]); 

    if (aNumbers == bNumbers) { 
    return aLetters.localeCompare(bLetters); 
    } 

    return aNumbers - bNumbers; 
    /* 
    // Or, for reverse order: 
    return -(aNumbers - bNumbers); 

    // or if you prefer to expand your terms: 
    return -aNumbers + bNumbers; 

    */ 
}); 

基本上我们正在分裂的|然后做在我们的+再次分裂自定义排序。我们将这些数字转换为整数,然后如果它们不同(例如300800),我们直接比较它们并返回结果(因为在这种情况下这些字母是无效的)。如果它们是相同的,尽管(300300)我们比较了第一部分(XXAXXX)并返回该结果(假设您需要进行普通的字母比较)。以这种方式整个数组被排序。

我不完全确定你的意思是什么,并在你的问题中颠倒过来,但希望这会让你开始。

正如您可能已经猜到的那样,这并不是完全最佳的,因为我们在每次迭代的每个元素上做splitparseInt,即使我们已经在之前的迭代中做过。这可以通过预处理输入来轻松解决,但只有200个元素,您可能看不到巨大的性能。

祝你好运!

+0

嗨,呃倒过来,因为数字是相反的,但阿尔法依然保持有序。其实我得到这个错误:对象800没有方法'localeCompare' – ChrisAdmin 2011-12-27 09:57:08

+0

什么浏览器?这个错误表明你在一个不是字符串的对象上调用'localeCompare'。像任何其他错误一样调试它。确保'userArr','aLetters'和'bLetters'包含你期望他们每次迭代的内容。如果他们不这样做,找出原因。 如果你想让数字反转,只需将'return aLetters.localeCompare ...'改为'return -aLetters.localeCompare ...'。进一步阅读:[(1)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/localeCompare)[(2)](https://developer.mozilla.org/en/JavaScript /参考/ Global_Objects /阵列/排序)。 – 2011-12-29 09:46:18

+0

@Jordan,在电话上键入帖子?无论是英雄还是瘾君子:-) – Kos 2011-12-29 09:59:09