Ruby - 将数组中的值推送到新数组

时间:2015-10-26 12:44:12

标签: ruby

我正在尝试打印此数组中所有组合的所有不同总和[1,2,3]。我想首先将每个求和结果推送到一个新的数组b,然后使用b.uniq打印它们,以便不重复求和结果。 但是,使用我的代码,3重复自己,我认为这是因为它被推入数组b的方式。

有更好的方法吗?

a = [1,2,3]
b = []

b.push a

b.push a.combination(2).collect {|a,b| (a+b)}

b.push a.combination(3).collect {|a,b,c| (a+b+c)}

puts b.uniq
p b #[[1, 2, 3], [3, 4, 5], [6]] 

有人可以帮我这个吗?我还是红宝石的新人。

2 个答案:

答案 0 :(得分:3)

因为可以使用Regexp.new对任意长度的Array求和,我们可以通过迭代范围inject(:+)来创建更通用的解决方案,其中1..n是长度n

Array

使用(1..(a.size)).flat_map do |n| a.combination(n).map { |c| c.inject(&:+) } end.uniq #=> [1, 2, 3, 4, 5, 6] ,我们可以避免获得嵌套的flat_map结果,并可以直接在其上调用Array。确保唯一性的另一个选择是将结果传递给Zookeeper clustered setup,Ruby在内部保证唯一性。

uniq

这适用于任何require "set" sums = (1..(a.size)).flat_map do |n| a.combination(n).map { |c| c.inject(&:+) } end Set.new(sums) #=> #<Set: {1, 2, 3, 4, 5, 6}> ,只要所有元素都是Array

答案 1 :(得分:0)

如果您想要的只是可能总和的数组,请在获取唯一值之前展平数组。

puts b.flatten.uniq

正在发生的事情是uniq在多维数组上运行。这会导致它在数组中查找重复的数组。你需要先将数组弄平。