【问题标题】:Ruby Iterating through multidimensional arraysRuby遍历多维数组
【发布时间】:2015-09-26 20:19:23
【问题描述】:

我只是想知道是否还有其他解决问题的好方法,如下所示:

p   [1,[2,3,"hi",[[[[2,"ex","bye"]]]]]].count_type(String)
# => 3

所以我们的目标是计算多维数组中的类型,但正如我所说,像这样的问题,不仅仅是这个问题。一般的问题是我们得到多维数组,然后我们需要搜索最小索引为 2 或其他条件的类型或数组。对于我的语言使用不当,我深表歉意,希望您明白这一点。

我知道递归方法有效。但是有没有其他的递归或非递归实现方式?

我使用以下:

  def count_type(type)
    counter = 0

    self.each { |elem|
      if elem.is_a?(type)
        counter +=1
      end

      if elem.is_a?(Array)
        counter += elem.method(type)
      end
    }
  end

  return counter

我知道elem.is_a?(type) 的部分有所不同,具体取决于您的要求。 我忘了告诉你,禁止使用 flatten,我的目标不是向类 Array 添加新方法,而是学习解决上述问题的新方法。

【问题讨论】:

  • 我不得不修正你的缩进,因为你在那里做的事情非常混乱。现在很明显发生了一些奇怪的事情。不过,method 方法不应该用于此目的。
  • 对于只是类型检查问题,您可以使用这一个班轮。您不需要覆盖 Array 类 [1,[2,3,"hi",[[[[2,"ex","bye"]]]]]].flatten.select{|elem| elem.is_a?(String)}.count

标签: arrays ruby recursion multidimensional-array


【解决方案1】:

我会尝试使其在风格上更符合 Ruby 核心功能,尤其是如果您打算将其添加到 Array 中:

class Array
  def deep_count(*args, &block)
    count = self.count(*args, &block)

    each do |e|
      count += e.deep_count(*args, &block) if e.is_a?(Array)
    end

    count
  end
end

[1,[2,3,"hi",[[[[2,"ex","bye"]]]]]].deep_count {|v| v.is_a?(String)}
# => 3

[1,[2,3,"hi",[[[[2,"ex","bye"]]]]]].deep_count(2)
# => 2

更新:不打内核数组的版本:

def array_deep_count(array, *args, &block)
  count = array.count(*args, &block)

  array.each do |e|
    count += e.deep_count(*args, &block) if e.is_a?(Array)
  end

  count
end

这主要涉及用参数交换self

【讨论】:

  • 谢谢!那很快。这对我来说有点太多了XD。我刚刚写了 class Array 因为我想使用 self 并且我认为没有它我不能使用 self 但我认为我错了^^。我只是想知道其他或更好的方法来遍历数组
  • 我认为OP不需要Array类覆盖。
  • 第二个要求不是 2 的数量。其最小索引为 2 的数组。
  • 最小长度为 2:[...].deep_count { |a| a.is_a?(Array) and a.length >= 2 }
  • 你能在不将其添加到 Array 的情况下给我看版本吗?我不明白你的方式。 ^^
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2013-04-01
相关资源
最近更新 更多