1

我正在尝试使用每个文件夹中包含的文件构建一个文件夹数组。因此,如果您的目录结构是:

DirA
  |- FileA
  \- FileB
DirB
  \- FileC

我得到了这个数组:

files = ["DirA/FileA", "DirA/FileB", "DirB/FileC"]

我正在尝试构建这样的哈希

{DirA => [FileA, FileB], DirB => [FileC]}

现在我正在以我认为相当非 Rubyish 的方式进行操作(假设 String 定义了一个获取父目录的方法):

h = {}
files.each do |f|
    parent = f.getParentDir
    if not h[parent] then h[parent] = [] end
    h[parent].push f
end

有没有更优雅的方式?

4

4 回答 4

0

我会做

h = {}
files.each do |f|
    (h[f.getParentDir] ||= []) << f
end
于 2012-08-25T03:38:19.620 回答
0

这可以解决问题:

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 } }
于 2012-08-25T03:42:44.720 回答
0

我认为你需要这个哈希(带数组)

{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
于 2012-08-25T03:43:36.593 回答
0
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"]}
于 2012-08-25T03:44:24.690 回答