哈希红宝石合并

问题描述 投票:0回答:2

我的txt文件包含几行,我想将每行添加到哈希,键为前2个单词,值为第3个单词...以下代码没有错误,但逻辑可能是错误的......最后一行是假设的打印哈希的所有键...但没有任何反应...请帮忙

    def word_count(string)
        count = string.count(' ')
        return count
    end
    h = Hash.new


    f = File.open('sheet.txt','r')
    f.each_line do |line|
        count = word_count(line)
        if count == 3
            a = line.split
            h.merge(a[0]+a[1] => a[2])
        end
    end
    puts h.keys
ruby hash
2个回答
2
投票

Hash#merge不修改你调用它的哈希值,它返回合并的哈希:

合并(other_hash)→new_hash

返回包含other_hash的内容和hsh内容的新哈希。 [...]

注意返回一个新的哈希...部分。当你这样说:

h.merge(a[0]+a[1] => a[2])

您将构建的新值合并到h的副本中,然后丢弃合并的哈希值;最终的结果是h从来没有添加任何东西,并且在你完成所有工作后最终都是空的。

您想使用merge!来修改哈希:

h.merge!(a[0]+a[1] => a[2])

或继续使用merge但保存返回值:

h = h.merge(a[0]+a[1] => a[2])

或者,因为您只添加一个值,只需指定它:

h[a[0] + a[1]] = a[2]

0
投票

如果要将每行的前三个单词添加到散列中,无论有多少单词,都可以删除if count == 3行。或者,如果您想确保至少有三个单词,您可以将其更改为if count > 2

mu也是正确的。你想要h.merge!

© www.soinside.com 2019 - 2024. All rights reserved.