2015-10-26 76 views
2

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

有没有更好的方法来做到这一点?

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]] 

有人可以帮助我吗?我仍然是红宝石新手。

+0

你需要在结果中嵌套数组吗? – nsave

+0

不,我想把它们显示为单独的值.. – bisuke

+0

那么你可以只是'p.flatten.uniq' – nsave

回答

0

如果你想要的只是一个可能的总和数组,在获得唯一值之前将数组展平。

puts b.flatten.uniq 

发生了什么是uniq正在运行在多维数组上。这会导致它在数组中查找重复的数组。您需要先将阵列平坦化。

3

由于任意长度的Array可使用inject(:+)被求和,我们可以创建通过遍历范围1..n,其中nArray的长度的更通用的解决方案。

(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结果,并且可以直接调用它uniq。确保唯一性的另一个选择是将结果传递给Set,为此,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}> 

这对于任何Array工作,只要所有元素都是Fixnum

相关问题