2011-12-27 41 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