在ruby中快速生成哈希数组的方法?
我正在尝试构建一个文件夹数组,每个文件夹中包含文件。因此,如果您的目录结构是:在ruby中快速生成哈希数组的方法?,ruby,Ruby,我正在尝试构建一个文件夹数组,每个文件夹中包含文件。因此,如果您的目录结构是: DirA |- FileA \- FileB DirB \- FileC 我得到了这个数组: files = ["DirA/FileA", "DirA/FileB", "DirB/FileC"] 我正试图构建一个这样的散列 {DirA => [FileA, FileB], DirB => [FileC]} 现在,我正在以一种我认为相当非rubysh的方式(假设String定义了一个获取父
DirA
|- FileA
\- FileB
DirB
\- FileC
我得到了这个数组:
files = ["DirA/FileA", "DirA/FileB", "DirB/FileC"]
我正试图构建一个这样的散列
{DirA => [FileA, FileB], DirB => [FileC]}
现在,我正在以一种我认为相当非rubysh的方式(假设String定义了一个获取父目录的方法):
还有更优雅的方式吗?我会的
h = {}
files.each do |f|
(h[f.getParentDir] ||= []) << f
end
h={}
文件。每个do | f|
(h[f.getParentDir]| |=[])这将实现以下目的:
result = files.group_by { |i| i.split("/").first }
result.each_key { |k| result[k] = result[k].map { |f| f.split("/").last } }
如果你想简洁,你可以用
result.merge!(result) { |k, v| v.map { |f| f.split("/").last } }
我想你需要这个散列(带数组)
{DirA=>[FileA,FileB],DirB=>[FileC]}
每个| u带有| u对象(Hash.new{| h,k | h[k]=[])do | m,res|
k、 v=m.split(“/”)
res[k]files=[“DirA/FileA”、“DirA/FileB”、“DirB/FileC”]
每个带有|对象(Hash.new{| h,k | h[k]=[])的|路径,Hash|
父级,file=path.split('/',2)
hash[parent]{“DirA”=>[“FileA”,“FileB”],“DirB”=>[“FileC”]}
您只关心目录中直接包含的文件,而不关心嵌套的文件/目录?我正在使用提供给我的文件列表,我希望通过它们的父目录引用它们,以便检查它们是否都存在。如果不是h[parent],则h[parent]=[]end
可以替换为h[parent]=[],除非h[parent]
或者更红的h[parent]| |=[]
。很好。更多的好答案,但这是最短的,它使用了我在String上定义的方法。在我的实际用例中,getParentPath
是我在NSURL
上定义的一种方法,但我试图为你们简化一些事情。干杯
result.merge!(result) { |k, v| v.map { |f| f.split("/").last } }
{DirA => [FileA, FileB], DirB => [FileC]}
files.each_with_object(Hash.new{|h,k|h[k]=[]}) do |m,res|
k,v = m.split('/')
res[k] << v
end
files = ["DirA/FileA", "DirA/FileB", "DirB/FileC"]
files.each_with_object(Hash.new { |h,k| h[k] = [] }) do |path, hash|
parent, file = path.split('/', 2)
hash[parent] << file
end
#=> {"DirA"=>["FileA", "FileB"], "DirB"=>["FileC"]}