在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"]}