2011-12-27 9 views
0

私はSOで見つかった正規表現ソートのいくつかを試しましたが、ストリーム内の+シンボルが気に入らないと思います。ソートする必要があります。 だから私は、出力形式にする必要があります数値が同じときにアルファベットを保持するストリームの数値ソート

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

をこの(3〜30文字「+」0〜64000の数)のように見えるのデータ・ストリームを取得しています:

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

+0

どのブラウザですか?このエラーは、文字列ではないオブジェクトに対して 'localeCompare'を呼び出すことを示唆しています。他のエラーと同様にデバッグしてください。 'userArr'、' aLetters'、および 'bLetters'にそれぞれの反復で期待されるものが含まれていることを確認してください。彼らがそうでなければ、理由を理解してください。 番号を逆にしたい場合は、 'return aLetters.localeCompare ...'を 'return -aLetters.localeCompare ...'に変更するだけです。さらに読む:[(1)](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/String/localeCompare)[(2)](https://developer.mozilla.org/ja/JavaScript)/Reference/Global_Objects/Array/sort)を参照してください。 –

+0

@Jordan、電話で投稿を入力していますか?主人公か中毒者のどちらか:-) – Kos

関連する問題