在ruby中生成哈希数组的快速方法?

时间:2012-08-25 03:13:30

标签: ruby

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

DirA
  |- FileA
  \- FileB
DirB
  \- FileC

我得到了这个数组:

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

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

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

现在我正在按照我认为相当非Ruby的方式(假设String有一个定义的方法来获取父目录):

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

有更优雅的方式吗?

4 个答案:

答案 0 :(得分:0)

我愿意

h = {}
files.each do |f|
    (h[f.getParentDir] ||= []) << f
end

答案 1 :(得分: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 } }

答案 2 :(得分: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

答案 3 :(得分: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"]}