在数组内的数组中动态创建哈希

时间:2013-12-18 14:09:27

标签: ruby arrays loops hash

我正在创建一个数组: 哈希所有的话 在所有段落数组中 对于文件夹中所有文件的数组

我相信我在所有段落的数组中都有所有单词的哈希值。但要为每个文件执行此操作,并为每个文件创建特定的密钥,这是一个过头的桥梁。

到目前为止,这是我的代码。在为文件夹中的所有文件创建唯一数组时出错,并将该文件的所有段落数组放入文件数组中。

numberfiles = Dir.glob(File.join('**', '*')).select { |file| File.file?(file) }.count
    countfiles+1
    # HERE I MAKE THE ARRAY FOR ALL FILES
        filesArray = Array.new(numberfiles.to_i, Hash.new)
        for j in 0...numberfiles.to_i do
            filesArray[j] = Hash.new    
        end

#now to open all textfiles..
Dir.glob("*.txt").each do |textfile|


    lines = File.readlines(textfile)
    text = lines.join
    paragraph_count = text.split("\.\r").length
    #create array with key for every paragraph
    testArray = Array.new(paragraph_count.to_i, Hash.new)
    for $i in 0...paragraph_count.to_i do
        testArray[$i] = Hash.new    
    end
    words_in_each_paragraph = Array.new

    i = 0

这里我想将所有的testarray保存到文件阵列中。这不起作用:

File.foreach(textfile, "\.\r") do |paragraph|
    word_hash = {}
    paragraph.split(/\W+/).each_with_object(word_hash) { |w, h|
        h[w] = []
    }
    words_in_each_paragraph << word_hash
    testArray[i][:value] = word_hash
    filesArray[j][:file] = testArray # HERE IT GOES WRONG
    i += 1
end

puts filesArray[1]
end

2 个答案:

答案 0 :(得分:2)

我不完全确定你要做什么,但我知道你不必在Ruby中预先分配数组的大小。下面的代码遍历每个.txt文件,将它们分成段落,并将这些段落中的每个单词放在哈希中。该字哈希附加到paragraph数组,而该数组又附加到files数组。

files = []

Dir.glob("*.txt").each do |textfile|
  paragraphs = []
  File.foreach(textfile, "\n\n") do |paragraph|
    words = Hash.new(0)
    paragraph.split(/\W+/).each {|word| words[word] += 1}
    paragraphs << words
  end
  files << paragraphs
end

p files

答案 1 :(得分:2)

如果你想对可枚举的每个元素做一些事情并将结果存储在一个数组中,那么请考虑map

result = Dir.glob("*.txt").map do |textfile|
  File.read(textfile).split("\n\n").map do |paragraph| #again!
    words = Hash.new(0)
    paragraph.split(/\W+/).each {|word| words[word] += 1} #copied from @Jonas Elfström
  end
end
p result