Ruby-将值从数组组合推送到新数组

Ruby-将值从数组组合推送到新数组,ruby,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+

我试图打印此数组中所有组合的所有不同和[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]] 

有人能帮我吗?我对ruby还是新手

如果您只需要一个可能和的数组,请在获得唯一值之前展平该数组

puts b.flatten.uniq

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

因为可以使用
注入(:+)
对任意长度的
数组进行求和,所以我们可以通过在
1..n
范围内迭代来创建更通用的解决方案,其中
n
数组的长度

(1..(a.size)).flat_map do |n|
  a.combination(n).map { |c| c.inject(&:+) }
end.uniq
#=> [1, 2, 3, 4, 5, 6]
通过使用
平面映射
,我们可以避免得到嵌套的
数组
结果,并且可以直接在其上调用
uniq
。另一个确保唯一性的选项是将结果传递给一个函数,Ruby在内部为该函数保证唯一性

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}>
需要“设置”
求和=(1..(a.size)).flat|u map do | n|
a、 组合(n).map{| c | c.inject(&:+)}
结束
新设(总数)
#=> #

这将适用于any
数组
,只要所有元素都是
Fixnum

您需要在结果中嵌套该数组吗?不,我不需要,我想将它们显示为单独的值。然后您可以只显示
p.flant.uniq
,但第一个
3
您看到,它不是求和运算的结果。