2012-10-30 2 views
1

En utilisant la méthode javascript sort(), j'essaie de trier une liste mais de trier dans un groupe de nombres pairs et de nombres impairs.Tri du tableau par des nombres pairs et impairs

Le code que j'ai essayé fonctionne bien avec une petite liste mais si la liste devient grande, elle ne me donne pas de résultat correct. Voici mon code.

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; 
 } 
}); 

Le code ci-dessus me donne comme par résultat accepté comme ce Ans - [0, 4, 6, 10, 12, 20, 5, 7, 13, 21, 99] et la deuxième Ans est: - [0, 10, 12, 20]

fonctionne bien avec cette liste, mais si je l'ai changé dans ce

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]; 

Mais dans ce cas, le résultat est quelque chose comme ceci qui n'est pas correct.

me donner cette aNs comme

[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] un mélange son des nombres impairs et pairs.

Cela ne me donne pas le bon résultat. Toute suggestion.

+3

S'il vous plaît définir, "Pas bon résultat" – SpYk3HH

+3

S'il vous plaît ajouter la sortie désirée au corps de question. – VisioN

Répondre

11

Le court le plus court:

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

Pour le faire fonctionner avec des chiffres négatifs, nous pouvons ajouter Math.abs():

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

Ou même variante plus compacte en utilisant bitwise AND:

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

C'est ce que je cherche merci @VisioN – Soarabh

+1

cette version courte est belle :) – Alnitak

+1

Bon travail! J'ai commencé à écrire une réponse, mais j'ai abandonné dès que j'ai vu ça. Élégant et correct. –

1

Modifier le code comme suit:

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

échantillon de travail est here.

Edit:

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; 
    } 
}); 

Edit 2: J'ai modifed le code pour les nombres négatifs. Voir working sample.

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

Non selon le résultat accepté. Le résultat est un mélange de pair et impair :( – Soarabh

+0

Vous avez raison, je dois faire un edit – Zafer

0

Mon essai:

fiddle

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));​ 
Questions connexes