【问题标题】:How to get the first key and value pair from a hash table in Ruby如何从 Ruby 中的哈希表中获取第一个键和值对
【发布时间】:2012-10-04 13:12:15
【问题描述】:

我正在尝试从 ruby​​ 中的哈希表中获取第一个键和值键。我不知道哈希的键值,因为它被传递给方法。我在网上找不到任何地方如何找到第一个键/值作为单独的哈希表。 我认为hash[0] 只会尝试查找名称为 0 的元素,当我运行代码时它只会返回nil

我知道我可以找到键名和值,然后从它们创建一个新的哈希,但我想知道是否有更简单的方法可以做到这一点,所以我马上得到一个哈希。

这是我的代码:

def rps_game_winner(game)

rock_in_hash = game.invert['R']
paper_in_hash = game.invert['P']
scissors_in_hash = game.invert['S']

if(rock_in_hash)
      if(paper_in_hash)
        return paper_in_hash;
      elsif(scissors_in_hash)
        return rock_in_hash
      end
    elsif(paper_in_hash)
      if(rock_in_hash)
        return paper_in_hash
      elsif(scissors_in_hash)
        return scissors_in_hash
      end
    end
        key = game.keys[-1]
        value = game.values[-1]
            winner = {key => value}
    return winner 
    end

game_one = { "Bob" => 'P', "Jim" => 'P' }

puts rps_game_winner(game_one)

这让我得到了正确的结果问题是我不明白为什么它是 -1 而不是零...... 我希望有一种更好的方法来获取哈希表的第一个键/值对,而不是使用从上一个表中检索到的键和值创建新的哈希表。

【问题讨论】:

    标签: ruby hash


    【解决方案1】:
    my_hash = { "a" => "first", "b" => "second" }
    
    { my_hash.keys.first => my_hash.values.first }
    

    这也有效

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:
    [hash.first].to_h
    

    另一种方法。

    【讨论】:

      【解决方案3】:

      有一个较短的答案不需要您使用额外的变量:

      h = { "a" => 100, "b" => 200 , "c" => 300, "d" => 400, "e" => 500}
      Hash[*h.first] #=> {"a" => 100}
      

      或者,如果您想在任何单个位置检索键/值

      Hash[*h.to_a.at(1)] #=> {"b" => 200}
      

      从一系列位置检索键/值

       Hash[h.to_a[1,3]] #=> {"b"=>200, "c"=>300, "d"=>400}
      

      【讨论】:

      【解决方案4】:

      你可以这样做

      key, value = hash.first
      

      或者如果您愿意:

      key = hash.keys[0]
      value = hash.values[0]
      

      那么也许:

      new_hash = {key => value}
      

      【讨论】:

      • 你的第一个例子在第 24 行:in rps_game_winner': undefined method first' for {"Jim"=>"P", "Bob"=>"P"}:Hash (NoMethodError) from t.rb :31。但真正让我大吃一惊的是,当我尝试第二种方法时(我试图避免这种方法,因为我认为有一种更简单的方法)我得到了第二个条目 Bob P,当我用键调用它时更奇怪的是 [-1 ] values[-1] 我得到了第一个条目 JimP 我完全不明白发生了什么。你有什么想法。我使用键盘来解释我的脚本。
      • 我认为您使用的是 1.8,那时哈希值不同。
      • 我刚刚在 IRB 中对此进行了测试,似乎第一种方法(hash.first)要好得多。它不必构造所有键/值的数组,因为它直接抓取第一个。第二种方法将创建数组来保存内存中的所有键/值,然后它可以从这些数组中获取第一个元素。如果您的哈希很大,这将花费更长的时间。
      • 如何返回散列的前十个值?
      • @AlfonsoVergara 在下面查看我的答案 :)
      猜你喜欢
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2016-06-10
      • 1970-01-01
      相关资源
      最近更新 更多