【发布时间】:2015-09-26 14:26:48
【问题描述】:
想象一下我有一个这样的数组
array = [4,"hello",[[3],:d,7,[:a,"seven"]]]
class Array
def deep_collect_by_elem_type_as_hash()
e = {}
self.each(){|x|
if x.is_a?(Array)
e.merge(x.deep_collect_by_elem_type_as_hash)
end
if !x.is_a?(Array)
if e.has_key?(x.class)
e[x.class]<<x
else
e[x.class] = [x]
end
end
}
return e
end
我希望我的所有数组都创建一个散列,其中的键包含我的数组中的不同类。 它们的值将是每个类的实际元素。
所以它看起来像这样:
{Fixnum=>[4, 3, 7], String=>["hello", "seven"], Symbol=>[:d, :a]}
我想在不使用 flatten 的情况下解决整个问题,但这样做是递归的。 扁平化解决方案可能如下所示:
def deep_collect_by_elem_type_as_hash1()
e = {}
flat= self.flatten()
flat.each(){|x|
if e.has_key?(x.class)
e[x.class]<<x
else
e[x.class] = [x]
end
}
return e
end
对于那些想知道为什么我不想使用 flatten 的人:我仍然无法完全理解如何实现递归方法,因此这是一个让我更好理解的问题。
我想我必须以某种方式实现与块的合并,但我无法找出合适的块。 merge(x.deep_collect_by_elem_type_as_hash(){|k,v1,v2| help}
【问题讨论】:
标签: arrays ruby recursion hash merge