2012-11-05 1 views
3

J'ai un tableau avec des chaînes et je voudrais l'ordre alphabétique mais avec quelques valeurs par défaut en haut. Par exemple:Ordre alphabétique dans le tableau avec plusieurs valeurs par défaut en haut

["a", "b", "default1", "d", "default2", "c", "e"] 

et je voudrais que le résultat soit:

["default1", "default2", "a", "b", "c", "d", "e"] 

quelqu'un a une idée comment je peux accomplir ce facile?

MISE À JOUR

Les valeurs par défaut sont également inclus dans le tableau et le tableau est dans l'ordre alphabétique.

+1

sont les choses que les valeurs par défaut que vous ajoutez explicitement, ou sont-ils inclus dans le tableau, et que vous voulez les forcer à la Haut? –

+0

est le tableau d'entrée pré-commandé? sinon, les valeurs par défaut sont-elles classées par ordre alphabétique? – tokland

Répondre

6

Enumerable comprend partition:

data = ["a", "b", "default1", "d", "default2", "c", "e"] 
data.partition{ |d| d['default'] }.flatten 
=> ["default1", "default2", "a", "b", "d", "c", "e"] 

Si les données que vous obtenez ne sont pas triées dans l'ordre final que vous voulez, vous pouvez pré-trier avant le partitionnement:

data = ["c", "b", "default2", "a", "default1", "e", "d"] 
data.sort.partition{ |d| d['default'] }.flatten 
=> ["default1", "default2", "a", "b", "c", "d", "e"] 

Si vous avez besoin d'un algori de tri plus intelligent et complet thm, pour gérer diverses entrées "par défaut", vous pouvez probablement utiliser sort ou sort_by avec un lambda ou proc qui peut faire la différence entre les valeurs par défaut et les entrées régulières, et retourner les valeurs requises -1, 0 et 1.

+0

Belle réponse, vous pouvez tester à peu près tout pour construire la partition, facile à lire! –

+0

L'utilisation de 'partition' est une bonne solution, le seul problème serait si Dans le second cas, les valeurs par défaut ne sont pas classées par ordre alphabétique (la question ne le spécifie pas) Un très petit choix: j'écrirais 'flatten (1)' pour préciser que je veux un niveau aplatissement pour déstructurer la partition (à mon humble avis, il est regrettable que 'flatten' soit récursif par défaut) – tokland

+0

La question de l'OP ne spécifie pas beaucoup de choses importantes, je suis d'accord que l'aplatissement ne devrait pas être récursif. cette question, le résultat de 'partition' est un tableau de tableaux de profondeur limitée,' flatten' sans paramètre est sûr –

4

Quelque chose comme cela fonctionne:

array = ["a", "b", "default1", "d", "default2", "c", "e"] 
defaults = ["default1", "default2"] #Add more if needed 
sorted_array = array.sort{|a, b| defaults.include?(a) ? -1 : defaults.include?(b) ? 1 : a <=> b } 
puts sorted_array # => ["default1", "default2", "a", "b" "c", "d", "e"] 
+0

Merci beaucoup! Je pense que la solution de The Thin Man est un peu plus propre mais c'est aussi une très bonne solution. Peut seulement accepter un :(Aller à préciser ma question un peu mieux –

3

Profitant de l'ordre lexicographique défini par un tableau, je vous écris:

defaults = Hash[["default1", "default2"].to_enum.with_index.to_a] 
xs = ["a", "b", "default1", "d", "default2", "c", "e"] 
xs.sort_by { |x| [defaults[x] || defaults.size, x] } 
#=> ["default1", "default2", "a", "b", "c", "d", "e"] 
Questions connexes