【问题标题】:ruby hash-table insert new element with existing keyruby 哈希表使用现有键插入新元素
【发布时间】:2013-04-14 10:08:24
【问题描述】:

假设我有一个单词数组,不同的单词可能有不同的长度,我想按长度组织它们。所以稍后我可以通过给出长度参数来访问所有具有相同长度的单词。

words = Array.new()
#fill words by reading file

words.each do |word|
    #add word to hash table, key is the length of this word
    #what can I do?
end

我已经检查了堆栈溢出中的其他问题和答案,但没有一个人告诉我们如何在旧键下插入一个新值,同时将它们全部保存在数组形式中。

【问题讨论】:

    标签: ruby hashtable


    【解决方案1】:
    %w(he is a good man).inject({}){|temp,ob| temp[ob.length] ||= [];temp[ob.length] = (temp[ob.length] + [ob]);temp}
    

    输出:

    {2=>["he", "is"], 1=>["a"], 4=>["good"], 3=>["man"]}
    

    require 'pp'
    pp %w[one two three four five six seven eight nine ten].inject({}){|temp,ob| temp[ob.length] ||= [];temp[ob.length] = (temp[ob.length] + [ob]);temp}
    

    输出:

    {3=>["one", "two", "six", "ten"],
     5=>["three", "seven", "eight"],
     4=>["four", "five", "nine"]}
    

    【讨论】:

    • 谢谢,但这对我来说有点难理解,我需要学习更多的ruby语法。
    【解决方案2】:

    从文件中读取单词后,可以使用group_by创建哈希:

    data = %w[one two three four five six seven eight nine ten]
    hash = data.group_by{ |w| w.size }
    

    此时,hash 是:

    { 3 => [ [0] "一", [1] “二”, [2]“六”, [3]“十” ], 5 => [ [0]“三”, [1] “七”, [2]“八” ], 4 => [ [0]“四”, [1]“五”, [2]“九” ] }

    【讨论】:

    • 或者,一如既往,group_by(&:size)
    • 我仍然对在示例代码中使用 proc 符号持谨慎态度。就在我认为安全的时候,有人突然出现运行 1.8 并且不承认。 :-/
    • @theTinMan 就像你现在可能的那样,ruby18 它已被弃用并且不再受支持。 ruby-lang.org/en/news/2011/10/06/plans-for-1-8-7恕我直言,我认为我们应该忘记使用 1.8 的人 ^_^
    • 可能是这样,但是 1.8.7 安装在数量惊人的机器上,人们没有能力或权利升级到更新的东西。我支持许多只有 1.8.6 和 1.8.7 的 CentOS 主机,所以我会自动安装 1.9.3 版本供我们的开发/生产使用,但很多都没有那么特权。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多