2017-10-09 4 views
0

Je voudrais trier un tableau de chaîne en fonction de ma commande personnalisée. Le problème est que je ne connais pas tous les éléments dans le tableau mais je suis sûr qu'il a 3 cordes (high/med/low). Donc j'aimerais que ces 3 soient les 3 premières valeurs. Reste enfinRuby tri personnalisé des premiers n éléments

Par exemple:

tableaux entrants

array1 = [ "haut", "bas" "pas Impt", "med", "sorte de impt"]
array2 = [ « faible », « priorité rand », « med », « haute »]

Seulement haute med et bas sont fixés, tout repos ne cessent de changer ou ne pas être présent à tous les

sortie requise [ « haut », « med », « faible », le repos. (Ordre n'a pas d'importance)]]

Je sais que je peux supprimer et fusionner, mais il sera source de confusion dans code pour savoir pourquoi je fais supprimer et fusionner. Une meilleure façon?

Répondre

2

Vous pouvez utiliser la méthode sort_by et mettre en œuvre quelque chose comme ceci:

["high", "not impt" , "med" , "kind of impt" , "low" ].sort_by do |a| 
    ["high", "med", "low"].index(a) || Float::INFINITY 
end 

index méthode renvoie 0, 1 et 2 pour "high", "med" et "low" en conséquence et nil pour d'autres valeurs. Ainsi, "high", "med" et "low" va être au début et à d'autres à la fin puisque chaque valeur est inférieure à Float::INFINITY

+0

Pour une raison quelconque son impression même order..Below est le code https: //codepad.remoteinterview .io/JMDYVQGSUV – TheLion

+0

C'est parce que 'sort_by' ne mute pas l'objet sur lequel il est appelé. Vous devez soit réaffecter le résultat, soit utiliser 'sort_by! 'Qui mute l'objet. J'ai mis à jour votre extrait de code: https://codepad.remoteinterview.io/JMDYVQGSUV –