2010-10-16 82 views
2

我有這樣的:訂購/隨機/轉換陣列

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

,我想談談一個加入B:

  • 下令值的陣列內
  • 隨機值

//更新:

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

如何在ruby中做到這一點?我使用導軌。

+0

,我不認爲你的結果括號匹配 - 你的意思是:[124123125],[ 126],[127,128]]? – Codebeef 2010-10-16 22:33:05

+0

你是說你想轉換爲b? – 2010-10-16 22:33:29

+0

你的'b = [[124,123,125]],[[126]],[[128] [127]]]'在ruby中是非法的。也許你的意思是[[123,124,125],[126],[127,128]]' – 2010-10-16 22:47:41

回答

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

這是瘋了!謝謝!哇,一句話,令人印象深刻! – 2010-10-16 23:08:53

+1

你甚至可以通過使用group_by的結果直接作爲散列'a.group_by(&:last).map {| _,v | v.map(&:first).shuffle}' – 2010-10-16 23:26:00

+1

是否需要排序?如果a是a = [[30,100],[123,1],[124,1],[125,1],[126,2],[127,3],[128,3]]'那麼結果是'[[30],[123,124,125],[126],[128,127]]' – 2010-10-16 23:37:00

0

一種解決方案是:

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 

運行:

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

以上的問題中更正了b,所以你會說:隨機化第一個。然後像你說的那樣做每一個?組內隨機數是重要的 – 2010-10-16 22:55:22

+0

然後你可以添加shuffle組加入結果 – 2010-10-16 23:26:23

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

thx Lars!雖然我更喜歡有更多的人類語言,所以在重新閱讀代碼的同時,對我來說它確實很有意義:) – 2010-10-16 23:44:37