我只是想知道是否有其他好的方法来解决这样的问题:
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类添加新方法,而是学习解决上述问题的新方法。
我会尝试使它更符合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
Update: Version without patch core Array:
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
。