2012-06-05 42 views
1

的所有組合的陣列。如果我有一個數組在Ruby中,像這樣:生成一個現有的陣列

["foo", "bar", "bat"] 

我怎樣可以產生價值的每一個組合新的陣列?

我需要的輸出看起來像這樣:

["foo", "bar", "bat", "foo-bar", "foo-bat", "bar-bat", "foo-bar-bat"] 

順序並不重要。此外,我不需要"foo-bar""bar-foo"

原始數組可能有多達5-6個成員。

回答

5
ar = ["foo", "bar", "bat"] 
p 1.upto(ar.size).flat_map {|n| ar.combination(n).map{|el| el.join('-')}} 
#=>["foo", "bar", "bat", "foo-bar", "foo-bat", "bar-bat", "foo-bar-bat"] 
+1

在ruby 1.9中,你可以使用'flat_map'而不是'map' +'flatten'。 – Casper

+0

@Casper是的,這更好,謝謝。 – steenslag

+0

完美的作品! –

2

你可以嘗試尋找在兩個數組的交叉產品

arr = %w(foo bar bat) 

arr.product(arr).collect{|el| el.uniq.join("-")} 
+0

這不會得到預期的結果:'[「富」,「富酒吧」,「富-BAT」 ,「bar-foo」,「bar」,「bar-bat」,「bat-foo」,「bat-bar」,「bat」] – Mischa

+0

這不處理結合2個以上元素的情況。 –

+0

啊,你是對的。我誤解了你的問題。我不僅看到了一對元素,而且還認爲你需要這兩個命令。我會在這裏留下來,以防萬一它幫助別人。 – Olives