1

それぞれに含まれるファイルを使用してフォルダーの配列を作成しようとしています。したがって、ディレクトリ構造が次の場合:

DirA
  |- FileA
  \- FileB
DirB
  \- FileC

そして、私はこの配列を与えられます:

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

私はこのようなハッシュを構築しようとしています

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

今、私はそれをかなり非ルビッシュな方法だと思う方法でやっています(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

これはトリックを行います:

result = files.group_by { |i| i.split("/").first }
result.each_key { |k| result[k] = result[k].map { |f| f.split("/").last } }

簡潔にする場合は、2行目を次のように置き換えることができます。

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 に答える
0

私はします

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