4 votes

Permutation de hachage en Ruby

Existe-t-il un moyen rapide d'obtenir une permutation (aléatoire) d'un hachage donné ? Par exemple, avec les tableaux, je peux utiliser la fonction échantillon comme dans

ruby-1.9.2-p180 :031 > a = (1..5).to_a
 => [1, 2, 3, 4, 5] 
ruby-1.9.2-p180 :032 > a.sample(a.length)
 => [3, 5, 1, 2, 4] 

Pour les hachages, je peux utiliser la même méthode sur les clés de hachage et construire un nouveau hachage avec

ruby-1.9.2-p180 :036 > h = { 1 => 'a', 2 => 'b', 3 => 'c' }
 => {1=>"a", 2=>"b", 3=>"c"} 
ruby-1.9.2-p180 :037 > h.keys.sample(h.length).inject({}) { |h2, k| h2[k] = h[k]; h2 }
 => {3=>"c", 2=>"b", 1=>"a"} 

mais c'est tellement laid. Existe-t-il une méthode "type" pour les hachages qui permet d'éviter tout ce code ?

Mise à jour Comme l'a souligné @Michael Kohl dans les commentaires, cette question n'a de sens que pour ruby 1.9.x. Puisque dans la version 1.8.x les hachures ne sont pas ordonnées, il n'y a aucun moyen de le faire.

9voto

steenslag Points 29662

Un léger raffinement de la réponse de mu est trop court :

h = Hash[h.to_a.shuffle]

4voto

mu is too short Points 205090

Il suffit d'ajouter un to_a y Hash[] à la version de votre tableau pour obtenir une version Hash :

h = Hash[h.to_a.sample(h.length)]

Par exemple :

>> h = { 1 => 'a', 2 => 'b', 3 => 'c' }
=> {1=>"a", 2=>"b", 3=>"c"}
>> h = Hash[h.to_a.sample(h.length)]
=> {2=>"b", 1=>"a", 3=>"c"}

0voto

Cyril Duchon-Doris Points 4798

Avez-vous vraiment besoin de mélanger les données ou avez-vous simplement besoin d'un moyen d'accéder à une clé aléatoire ou de l'itérer ?

Sinon, une solution peut-être moins coûteuse serait de mélanger les clés de hachage et d'accéder à vos éléments en fonction de la permutation de ces clés de hachage.

h = your_hash
shuffled_hash_keys = hash.keys.shuffle

shuffled_hash_keys.each do |key|
  # do something with h[key]
end

Je pense (mais j'aurais besoin d'une preuve avec un benchmark) que cela évite le besoin/coût de construire un tout nouveau hash et est probablement plus efficace si vous avez de grands hashs (vous avez seulement besoin de payer le coût d'une permutation de tableau).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X