我需要将字符串转换为哈希内的整数

时间:2018-12-30 21:56:14

标签: ruby

我有一个嵌套的哈希,我需要返回内部哈希,它是键的值。问题在于值之一是字符串,需要将其作为整数返回。

def player_stats(player_name)
  game_hash.keys.each do |data|
    if game_hash[data][:players].keys.include?(player_name)
      return game_hash[data][:players][player_name]
    end
  end
end

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}, 

代码是正确的,唯一的是我需要输入将字符串**(:shoe)**转换为整数的行。

3 个答案:

答案 0 :(得分:0)

game_hash = {
  :home => {:team_name =>"Brooklyn Nets",
            :colors => ["Black", "White"], 
            :players => {
              "Alan Anderson" => {
               :number => 0,
               :shoe => "16", 
               :points => 22,
              }
            }
           }
} 

在这种情况下,假设您不想突变(修改)原始哈希,最简单的是首先制作game_hash深层副本

h = Marshal.load(Marshal.dump(game_hash))
  #=> {:home=>{:team_name=>"Brooklyn Nets", :colors=>["Black", "White"],
  #    :players=>{"Alan Anderson"=>{:number=>0, :shoe=>"16", :points=>22}}}}

请参见Marshall::loadMarshall::dump

然后只需修改感兴趣的值:

h[:home][:players]["Alan Anderson"][:shoe] =
  h[:home][:players]["Alan Anderson"][:shoe].to_i
h #=> {:home=>{:team_name=>"Brooklyn Nets", :colors=>["Black", "White"],
  #    :players=>{"Alan Anderson"=>{:number=>0, :shoe=>16, :points=>22}}}}

最后,让我们确认原始哈希没有突变:

game_hash
  #=> {:home=>{:team_name=>"Brooklyn Nets", :colors=>["Black", "White"],
  #    :players=>{"Alan Anderson"=>{:number=>0, :shoe=>"16", :points=>22}}}}

答案 1 :(得分:0)

在您的代码之后,仅作了几处更改(请参阅下面选项中的内联注释)。

给出game_hash,它在某处可能有整数作为字符串:

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}}}}

这是选项:

def player_stats(player_name, game_hash) # <-- pass game_hash as parameter
  game_hash.keys.each do |data|
    if game_hash[data][:players].keys.include?(player_name)
      return game_hash[data][:players][player_name].transform_values { |v| v.to_i } # <-- transform values to integer
    end
  end
end

然后,您可以致电:

player_stats("Reggie Evans", game_hash)
#=> {:number=>30, :shoe=>14, :points=>12, :rebounds=>12, :assists=>12, :steals=>12, :blocks=>12, :slam_dunks=>7}

答案 2 :(得分:0)

我想在您的#player_stats方法中指出一些“问题”,但我将重点介绍将玩家哈希值转换为整数的问题。首先,我要进行以下假设:

  1. 在将值格式化为字符串还是整数方面并不一致。
  2. 所有值都是Integer类型或String类型的整数形式。

我想指出的一件事是,鞋子的大小可以是9.510.5,依此类推。这可能是鞋子值被格式化为字符串的原因。如果是这种情况,那么您需要考虑到这一点,并使用#to_f而不是#to_i转换为浮点数。但是由于您的问题是要求它是整数,因此在下面的示例中,我将使用#to_i

根据我的假设,您只需遍历玩家哈希中的所有值,然后对值调用#to_i即可将其转换为整数。可以使用以下方法完成此操作:

def convert_hash_values_to_int(hash)
  hash.each do |key, value|
    hash[key] = value.to_i
  end
end

您可以在#player_stats方法内调用此方法。 请注意,此方法会在不创建新哈希的情况下就地改变原始哈希值。如果不希望这样做,则应使用#inject

def convert_hash_values_to_int(hash)
  hash.inject({}) do |result, (key, value)|
    result[key] = value.to_i
    result
  end
end

这将使用转换后的值创建一个新的哈希,然后将其返回。

使用#each_with_object可以进一步简化该操作,该操作还会创建一个新的哈希而不是对原始哈希进行突变:

def convert_hash_values_to_int(hash)
  hash.each_with_object({}) do |(key, value), result|
    result[key] = value.to_i
  end
end

此方法不需要您在每个循环中返回result。请注意,参数切换为#each_with_object-|(key, value), result|而不是|result, (key, value)|

您还可以使用另一种方法,它最简洁,但仅在Ruby 2.4+中可用

def convert_hash_values_to_int(hash)
  hash.transform_values do |value|
    value.to_i
  end
end

哪个更简洁:

def convert_hash_values_to_int(hash)
  hash.transform_values(&:to_i)
end

#transform_values不会变异原始哈希。如果您想更改原始哈希,则需要使用bang:

def convert_hash_values_to_int(hash)
  hash.transform_values!(&:to_i)
end