我只想知道是否还有其他好方法可以解决以下问题:
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中添加新方法,而是学习解决上述问题的新方法。
答案 0 :(得分:0)
我尝试使用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
交换参数。