【问题标题】:How populate array of strings to avoid nested loops如何填充字符串数组以避免嵌套循环
【发布时间】:2017-05-06 08:17:12
【问题描述】:

我必须根据三组不同的数组对象准备字符串数组

object1 = ['a', 'b', 'c']
object2 = [1, 2, 3, 4]
object3 = ['xx', 'yy']

目前,我正在使用嵌套循环

result = []
object1.each do |ob1|
  object2.each do |ob2|
    object3.each do |ob3|
      result << "#{ob1}-#{ob2}-#{ob3}"
    end
  end
end

result
=> ["a-1-xx", "a-1-yy", "a-2-xx", .... , "c-3-xx", "c-3-yy", "c-4-xx", "c-4-yy"]

有没有更好的方法来填充数据以另一种方式来避免嵌套循环

【问题讨论】:

  • 也可以使用ziptranspose 来做到这一点。

标签: ruby-on-rails arrays ruby loops foreach


【解决方案1】:

你更喜欢这个吗?

object1.product(object2, object3).map { |e| e.join('-') }

【讨论】:

  • 当然,它仍然是 t̶u̶r̶t̶l̶e̶s̶ 循环。我想,你根本无法避免这种情况。
  • 可以使用(尾)递归来实现。或inject。或者作为一种变质。
  • ...泛化为arr.first.product(*arr.drop(1)).map {...,其中arr = [object1, object2, ...]
【解决方案2】:

这是一种仅使用一个显式循环来定义数组的方法。没有隐藏的嵌套循环的方法调用:

object1 = ['a', 'b', 'c']
object2 = [1, 2, 3, 4]
object3 = ['xx', 'yy']
n1, n2, n3 = object1.size, object2.size, object3.size

result = Array.new(n1 * n2 * n3) do |i|
  [
    object1[i / (n2 * n3)],
    object2[i / n3 % n2],
    object3[i % n3]
  ].join('-')
end
# ["a-1-xx", "a-1-yy", "a-2-xx", "a-2-yy", "a-3-xx", "a-3-yy", "a-4-xx", "a-4-yy", "b-1-xx", "b-1-yy", "b-2-xx", "b-2-yy", "b-3-xx", "b-3-yy", "b-4-xx", "b-4-yy", "c-1-xx", "c-1-yy", "c-2-xx", "c-2-yy", "c-3-xx", "c-3-yy", "c-4-xx", "c-4-yy"]

不过,它肯定不会比您的代码更清晰或更健壮。

【讨论】:

  • 虽然不是非常通用的解决方案 - 如果向任何数组添加一个额外的元素 - 解决方案将不得不改变
  • @WandMaker:已更新。
猜你喜欢
  • 2015-01-09
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
相关资源
最近更新 更多