2012-06-05 47 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