1

javascriptsort()メソッドを使用して、リストの並べ替えを実行しようとしていますが、並べ替えには偶数と奇数のグループがあります。

私が試したコードは小さなリストでも問題なく動作していますが、リストが大きくなると適切な結果が得られません。これが私のコードです。

var n = [10,20,21,4,5,6,7,99,0,12,13];
//var n = [10,20,0,12];
n.sort(function(a,b){
 if (a % 2 !=b % 2 ){
   return a%2;
  }else {
    return a - b; 
  }
});

上記のコードは、このAnsのような受け入れられた結果に従って私に与えます-[0, 4, 6, 10, 12, 20, 5, 7, 13, 21, 99]そして2番目のAnsは:-[0, 10, 12, 20]

このリストで問題なく動作しますが、これに変更した場合

var n = [10,20,21,4,5,6,7,99,0,12,13,10,20,21,4,5,6,7,99,0,12,13,10,20,21,4,5,6,7,99,0,12,13,10,20,21,4,5,6,7,99,0,12,13];

しかし、この場合、結果はこのようなものになり、適切ではありません。

このようなAnsをください

[0, 0, 0, 0, 4, 4, 4, 4, 6, 6, 6, 6, 10, 10, 10, 10, 12, 5, 12, 5, 12, 5, 20, 20, 20, 20, 5, 12, 7, 7, 7, 7, 13, 13, 13, 13, 21, 21, 21, 21, 99, 99, 99, 99]奇数と偶数の混合です。

それは私に適切な結果を与えません。なにか提案を。

4

3 に答える 3

14

最短のショート:

n.sort(function(a, b) {
    return a % 2 - b % 2 || a - b;
});

負の数で機能させるために、次を追加できMath.abs()ます。

n.sort(function(a, b) {
    return Math.abs(a % 2) - Math.abs(b % 2) || a - b;
});

または、ビット単位のANDを使用したさらにコンパクトなバリアント:

n.sort(function(a, b) {
    return (a & 1) - (b & 1) || a - b;
});

最もコンパクトなバージョン(ES6):

n.sort((a, b) => (a & 1) - (b & 1) || a - b);
于 2012-10-30T13:22:28.813 に答える
1

次のようにコードを変更します。

n.sort(function(a,b){
 if (a % 2 != b % 2 ){
   return a%2;
  }else {
      return (a - b) > 0 ? 1 : -1; 
  }
});

作業サンプルはこちらです。

編集:

n.sort(function(a,b){
 if (a % 2 != b % 2 ){
     return a%2 == 0 ? -1 : 1; // this is the fix :)
  }else {
      return (a - b) > 0 ? 1 : -1; 
  }
});

編集2:負の数のコードを変更しました。作業サンプルを参照してください。

n.sort(function(a,b){
 if (a % 2 != b % 2 ){
   return Math.abs(a)%2;
  }else {
      return a > b ? 1 : -1; 
  }
});
于 2012-10-30T13:20:09.307 に答える
0

私の試み:

フィドル

var n = [10,20,21,4,5,6,7,99,0,-12,12,13,-45,10,20,21,-13,4,5,6,7,99,0,12,13,10,-99,20,21,4,5,6,7,99,0,12,13,10,20,21,4,5,6,7,99,-15,-18,0,12,13];

function sort(a, b) {
    if (!(a % 2) && !(b % 2)) {
        return a > b ? 1 : -1;
    }
    if ((a % 2) && (b % 2)) {
        return a > b ? 1 : -1;
    }
    if ((a % 2) && !(b % 2)) {
        return 1;
    }
    return -1;
}
console.log(n.sort(sort));​
于 2012-10-30T13:57:11.600 に答える