【问题标题】:Finding the largest value in a nested hash查找嵌套哈希中的最大值
【发布时间】:2018-07-29 04:24:11
【问题描述】:

我无法在哈希中找到与鞋码键关联的最大值。这是我到目前为止所拥有的

    def biggest_shoe
      max_size = nil

      game_hash.each do |location, team_data|
        team_data[:players].each do |player, stats|
          size = stats[:shoe]
          if max_size < size
            max_size = size
            #binding.pry
          end
        end
      end
    end

我能够在整个迭代过程中使用 stats[:shoe] 成功地获取鞋子的单个值,但是从那里我还没有找到一种方法来从其迭代的哈希中提取最大尺寸。

哈希:

    def game_hash
      {
        home: {
          :team_name => "Brooklyn Nets",
          :colors => ["Black", "White"],
          :players => {
            "Alan Anderson" => {
              :number => 0,
              :shoe => 16,
              :points => 22,
              :rebounds => 12,
              :assists => 12,
              :steals => 3,
              :blocks => 1,
              :slam_dunks => 1
            },
            "Reggie Evans" => {
              :number => 30,
              :shoe => 14,
              :points => 12,
              :rebounds => 12,
              :assists => 12,
              :steals => 12,
              :blocks => 12,
              :slam_dunks => 7
            },
            "Brook Lopez" => {
              :number => 11,
              :shoe => 17,
              :points => 17,
              :rebounds => 19,
              :assists => 10,
              :steals => 3,
              :blocks => 1,
              :slam_dunks => 15
            },
            "Mason Plumlee" => {
              :number => 1,
              :shoe => 19,
              :points => 26,
              :rebounds => 12,
              :assists => 6,
              :steals => 3,
              :blocks => 8,
              :slam_dunks => 5
            },
            "Jason Terry" => {
              :number => 31,
              :shoe => 15,
              :points => 19,
              :rebounds => 2,
              :assists => 2,
              :steals => 4,
              :blocks => 11,
              :slam_dunks => 1
            }
          }
        },
        away: {
          :team_name => "Charlotte Hornets",
          :colors => ["Turquoise", "Purple"],
          :players => {
            "Jeff Adrien" => {
              :number => 4,
              :shoe => 18,
              :points => 10,
              :rebounds => 1,
              :assists => 1,
              :steals => 2,
              :blocks => 7,
              :slam_dunks => 2,
            },
            "Bismak Biyombo" => {
              :number => 0,
              :shoe => 16,
              :points => 12,
              :rebounds => 4,
              :assists => 7,
              :steals => 7,
              :blocks => 15,
              :slam_dunks => 10
            },
            "DeSagna Diop" => {
              :number => 2,
              :shoe => 14,
              :points => 24,
              :rebounds => 12,
              :assists => 12,
              :steals => 4,
              :blocks => 5,
              :slam_dunks => 5
            },
            "Ben Gordon" => {
              :number => 8,
              :shoe => 15,
              :points => 33,
              :rebounds => 3,
              :assists => 2,
              :steals => 1,
              :blocks => 1,
              :slam_dunks => 0
            },
            "Brendan Haywood" => {
              :number => 33,
              :shoe => 15,
              :points => 6,
              :rebounds => 12,
              :assists => 12,
              :steals => 22,
              :blocks => 5,
              :slam_dunks => 12
            }
          }
        }
      }
    end

【问题讨论】:

  • 能显示game_hash hash的内容吗?里面是什么?它可能会帮助人们回答您的问题。
  • 这个问题举个例子。 game_hash 不能是散列,因为它是方法 biggest_shoe 的本地。你的意思是game_hash 是一种方法(尽管它的名字)?如果它是一个哈希,它需要作为参数传递给方法。
  • 您在发布问题 8 小时后的编辑会使已发布的两个答案变得毫无意义。这是一个很大的禁忌。投反对票是我的。

标签: ruby hash


【解决方案1】:

就像很多常见的事情一样,Ruby 有一个工具:

game_hash.values.map do |team_data|
  team_data[:players]
end.values.map do |stats|
  stats[:shoe]
end.max

【讨论】:

    【解决方案2】:
    game_hash[:home][:players].max_by { |_name, stats| stats[:shoe] }.last[:shoe]
      #=> 19
    

    【讨论】:

      【解决方案3】:

      这一行将所有鞋子的值放入一个数组中,然后选择最大值。

      game_hash.map { |_, v| v[:players].map { |_, v| v[:shoe] } }.flatten.max
      

      创建一个方法来获取所选键的最大值

      def pick_max_stat_from(h, key)
        h.map { |_, v| v[:players].map { |_, v| v[key] } }.flatten.max
      end
      
      pick_max_stat_from game_hash, :slam_dunks # => 15
      

      也许这可能有助于按位置获取最大值:

      game_hash.transform_values { |v| v[:players].map { |_, v| v[:shoe] }.max }
      # = {:home=>19, :away=>18}
      

      【讨论】:

      • 您可以通过写game_hash.map { |_,location|...跳过提取值的步骤
      • 知道了。谢谢@CarySwoveland
      • 这些答案都是很棒的资源!非常感谢您提供的信息。我对红宝石还很陌生,所有这些不同的答案都有很大帮助!非常感谢
      猜你喜欢
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2020-02-14
      相关资源
      最近更新 更多