2010-10-20 10 views
-2

J'ai gammeTri en Array Ruby

a = ["aaa", "bee", "cee", "dee"] 

Je veux avoir nouveau tableau sorte que comme:

a = ["cee", "aaa", "dee", "bee"] 

S'il vous plaît aidez-moi. Merci.

+0

Comment exactement est-ce «trié»? –

+0

Désolé mais je ne reçois pas l'ordre de votre résultat souhaité. – Ruel

+0

Quelle est la logique concrète du tri souhaité? Pouvez-vous donner un autre exemple? Ou devrait le tri (basé sur des indices) par conséquent ressembler à 2, 0, 3, 1 pour les tableaux avec une longueur de 4? – Flinsch

Répondre

4
a = ["aaa", "bee", "cee", "dee"] 
b = [a[2], a[0], a[3], a[1]] 

Désolé, n'a pas pu résister. Sérieusement, veuillez expliquer cet étrange "tri".

+1

+1 parce que c'est rapide :) –

2

vous pouvez donner un bloc pour la méthode Array.sort d'avoir un tri personnalisé, comme celui-ci:

[ "aaa", "bee", "cee", "dee"].sort do |x,y| 
    # do the actual custom sorting 
end 
0

Voulez-vous profiter de vos commentaires, vous voulez trier un tableau avec des noms comme Blueray,DVD, ipodDVD, Bluray, ipod. Un tableau est par définition basé sur l'ordre, contrairement à un hachage. Donc, si possible, vous pourriez simplement redéfinir votre tableau dans le bon ordre.

Sinon, je suggère d'utiliser une table de domaine, avec un identifiant, un nom et une description. Assurez-vous juste d'insérer les lignes dans le bon ordre (l'identifiant est la commande), et toutes vos boîtes de sélection peuvent utiliser ces options triées comme vous le souhaitez. En utilisant également une table de domaine, vous pouvez simplement vous référer au type de vidéo par identifiant.

0
a = ["aaa", "bee", "cee", "dee"] 
a = [2, 0, 3, 1].map { |i| a[i] } 
p a # => ["cee", "aaa", "dee", "bee"] 
1

Observez l'intersection d'un tableau, par ex. [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]

Le premier des deux tableaux détermine le tri des éléments. Il suffit donc d'utiliser un tableau prédéfini ["DVD", "Blueray", "ipod"] et d'effectuer une opération d'intersection avec le tableau non trié: a = ["DVD", "Blueray", "ipod"] & a.

Par exemple: a = ["DVD", "Blueray", "ipod"] & ["ipod", "DVD"] #=> ["DVD", "ipod"].

Solution très élégante et simple. Bonus: les valeurs invalides sont ignorées sans aucune exception ou erreur. (Est-ce un bonus? Peut-être!)

+0

Je ne sais pas si c'est ce que l'OP a besoin, mais j'ai appris quelque chose de nouveau :) – nathanvda