2009-10-19 8 views
4

Disons que j'ai un hachage en Ruby comme ceci:Fractionnement d'un hachage Ruby dans les touches triées/associées les valeurs

d = {1 => 'one', 3 => 'three', 2 =>'two'} 

et je souhaite obtenir

x = [1, 2, 3] 
y = ['one', 'two', 'three'] 

qui est, je veux que le tri les touches x et les valeurs correspondantes dans y. Je souhaite potentiellement utiliser un ordre de tri personnalisé pour x.

Quelle est la manière la plus propre et la plus simple de faire cela?

+0

Puis-je vous demander pourquoi vous avez un hachage avec les touches numériques au lieu d'un tableau? Ou est-ce que cela a plus de sens sur votre jeu de données réel? –

+0

absolument, il est plus logique avec mon jeu de données réelles. – Peter

Répondre

8

Facile:

x,y = d.sort.transpose 

Ou, avec une sorte personnalisée:

x,y = d.sort_by {|k,v| whatever}.transpose 
+0

Vous avez mon vote. – jrhicks

+0

ok! c'est évidemment la manière «correcte». Merci. – Peter

+0

transpose = unzip ... choix de nom impair mais a aussi mon vote –

8

ma réponse originale

x = d.keys.sort 
y = x.map {|k| d[k]} 

mais vous devriez également voir la réponse de Glenn McDonald

x,y = d.sort.transpose 
0
x, y = d.keys.sort{|a,b| a <=> b}.inject([]){|result, key| result << [key, d[key]]}.transpose 

... fait le tri explicite de sorte que vous pouvez changer à tout ce que vous aimez.

Questions connexes