2010-10-16 7 views
2

J'ai ceci:commande/randomiser/convertir tableau dans les rails

a = [[123,1],[124,1],[125,1],[126,2],[127,3],[128,3]] 

Et je voudrais changer a en b:

  • classées par ordre décroissant
  • aléatoire dans tableau de valeur

// mise à jour:

b = [[124,123,125],[126],[128,127]] 

Comment faire cela dans ruby? Im en utilisant des rails.

+0

Je ne pense pas que vos supports de résultats correspondent - voulez-vous dire: [[124123125], [ 126], [127,128]]? – Codebeef

+0

Voulez-vous dire que vous voulez convertir un à b? –

+0

votre 'b = [[124,123,125]], [[126]], [[128] [127]]]' est illégal dans ruby. peut-être que vous voulez dire [[123, 124, 125], [126], [127, 128]] ' –

Répondre

5
a.group_by(&:last). 
    sort_by(&:first). 
    map(&:last). 
    map {|el| el.map(&:first).shuffle } 
+0

c'est fou !! Je vous remercie! wow, 1 phrase, impressionnant! –

+1

Vous pouvez même vous débarrasser de la première carte en utilisant le résultat de group_by directement comme un hash 'a.group_by (&: last) .map {| _, v | v.map (&: first) .shuffle} ' –

+1

n'a-t-il pas besoin d'être trié? Si a est 'a = [[30,100], [123,1], [124,1], [125,1], [126,2], [127,3], [128,3]]' alors le résultat est '[[30], [123, 124, 125], [126], [128, 127]]' –

0

Une solution est:

a = [[123,1],[124,1],[125,1],[126,2],[127,3],[128,3]] 

a = a.sort {|d, e| d[1] <=> e[1]} 

prev = a[0][1]; result = []; group = []; 

a.each do |e| 
    if e[1] == prev 
    group << e[0] 
    else 
    result << group.shuffle 
    group = [e[0]] 
    prev = e[1] 
    end 
end 
result << group 

p result 

course:

$ ruby t.rb 
[[125, 123, 124], [126], [127, 128]] 
+0

ok, donc vous diriez: randomiser une première. Puis faire un.each comme vous l'avez dit? le groupe aléatoire au sein est important –

+0

alors vous pouvez ajouter aléatoire au groupe lors de l'ajout au résultat –

0
a.reduce([]){|m,i|m[i[1]]=(m[i[1]]||[])<<i[0];m}.compact 
+0

thx Lars! Bien que je préfère avoir un peu plus de langage humain, cela a du sens pour moi en relisant le code un certain temps :) –