【问题标题】:How to develop a Ruby array如何开发一个 Ruby 数组
【发布时间】:2011-07-16 20:39:15
【问题描述】:

我有一个 n 维的因式分解数组,我想开发它。

这是一个例子:

develop([:a, :aa]) #=> [[:a, :aa]]

...等同于:[:a].product([:aa])

或者,更复杂:

develop([:a, [:aa, :bb]]) #=> [[:a, :aa],
                               [:a, :bb]]

我正在使用 Ruby 1.9。谢谢你的任何想法。

编辑:

另一个例子,有 3 层嵌入数组:

develop([:a, [[:b, [:ba, :bb]],
              [:c, [:ca, :cb]],
              [:d, [:da, :db]]]]) #=> [[:a, :b, :ba],
                                       [:a, :b, :bb],
                                       [:a, :c, :ca],
                                       [:a, :c, :cb],
                                       [:a, :d, :da],
                                       [:a, :d, :db]]

我想知道我们是否可以使用 Array 的产品方法 (http://ruby-doc.org/core-1.9.3/Array.html#method-i-product),即使我们有一些嵌入式数组。

【问题讨论】:

  • 有趣的问题。在家工作? :) 您可以简单地使用map 来完成浅表案例。玩得开心。这些算法非常适合用 Ruby 编写。
  • 不不,这不是家庭作业;)嗯,我明白了。但也许深层案例是矫枉过正的......我希望还有一种更轻松的方法来做到这一点。
  • 8 分钟后没有答案?好的,这里是浅层案例:def develop(a); a[1].map{|x| [a[0],x]}; end 如果您无法将其扩展到深层案例,请告诉我们,除非这是一个真正的家庭作业问题。
  • 我写最后一条时没有看到你的最后一条评论。我可以为你掀起深案。不过可能需要几分钟。
  • 实际上,我想除了深入的案例地图 n 次之外还有其他方法......你看看这是否可能,@Ray?

标签: ruby arrays multidimensional-array


【解决方案1】:

我不确定我是否完全理解您要对这些糟糕的数组执行什么操作,但我设法创建了一个函数,可以为您指定的两种情况提供正确的输出。完整代码如下:

def develop(x)
  return x unless x.is_a? Array
  y = []
  x[1].each do |s|
    d = develop(s)
    d = [d] unless d.is_a? Array
    d.each do |t|
      t = [t] unless t.is_a? Array
      y << [x.first] + t
    end
  end
  return y
end

x = [:a,
        [
            [:b, [:ba, :bb]],
            [:c, [:ca, :cb]],
            [:d, [:da, :db]]
        ]
    ]

p develop(x)

p develop [:a, [:aa, :bb]]

输出是:

C:\Users\David\Documents\scraps\test_ruby>ruby test.rb
[[:a, :b, :ba], [:a, :b, :bb], [:a, :c, :ca], [:a, :c, :cb], [:a, :d, :da], [:a, :d, :db]]
[[:a, :aa], [:a, :bb]]

编辑 1:这是一个较短的版本,也提供了正确的输出:

def develop(x)
  return [x] unless x.is_a? Array
  Array(x.last).collect do |s|
    develop(s).collect do |t|
      [x.first] + Array(t)
    end
  end.flatten 1
end

【讨论】:

  • 其实我上一个例子搞错了。道歉。为了澄清它,我用其他一些例子重写了我的帖子。
  • 我的回答还有用吗?您能否单击复选标记以接受我的答案或告诉我为什么现在错了?
  • 天啊,其实是我。对不起,你的版本很完美!
  • 我冒昧地对短版本进行了两个小改动:一个是让它适用于 OP 的第一个示例,另一个是稍微缩短它。
猜你喜欢
  • 2011-10-21
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多