a = [1,2,3]
b = [4,5 ]
我想要的是同时迭代这两个集合并使用迭代器做一些事情,伪代码就像:
for i in a
for j in b
collect i * j
当一个集合用完元素时,循环停止。
结果将为[4, 10]
我拥有的是:
a = [1,2,3]
b = [4,5 ]
a.zip(b).reject { |c| c.any? { |d| d.nil? } }.map { |e| e.reduce(&:*) }
有更好的解决方案吗?谢谢!
我正在寻找的完美解决方案是匹配伪代码的意图。
答案 0 :(得分:2)
你可以这样做:
a, b = b, a if b.length < a.length
a.zip(b).map { |ia, ib| ia * ib }
# => [4, 10]
第一行确保数组a
最多具有与数组b
相同数量的元素。这是因为zip
创建了一个由被调用数组长度组成的数组。将a
作为最短数组可确保不存在nil
s。
答案 1 :(得分:1)
这是另一种方法:
[a.length, b.length].min.times.map {|i| a[i]*b[i] }
我们的想法是你使用两个数组长度[a.length, b.length].min
中较短的一个,然后在整数i
上迭代多次,用作数组的索引。< / p>