Мне нужно преобразовать строку в целое число в хэше - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть вложенный хеш, и мне нужно вернуть внутренний хеш, который является значением ключа.Проблема в том, что одно из значений представляет собой строку, и ее нужно возвращать как целое число.

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

Код правильный, единственное, что мне нужно ввести строку, которая будет преобразовывать строку** (: чистка) ** в целое число.

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

После вашего кода, всего пара изменений (см. Встроенные комментарии в опции ниже).

Учитывая 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}
0 голосов
/ 31 декабря 2018

Есть несколько «проблем», на которые я хотел бы обратить внимание в вашем методе #player_stats, но я сосредоточусь на вашей проблеме с преобразованием хеш-значений игрока в целые числа.Для начала я делаю следующие предположения:

  1. Нет согласованности в том, отформатированы ли значения в виде строки или целого числа.
  2. Все значения имеют целочисленную форму, либо в типе Integer, либо в типе String.

Я хотел бы отметить, что размер обуви может быть9.5 или 10.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 не изменяет исходный хеш.Если вы хотите изменить исходный хеш, вам нужно использовать удар:

def convert_hash_values_to_int(hash)
  hash.transform_values!(&:to_i)
end
0 голосов
/ 31 декабря 2018
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 :: load и Marshall :: 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}}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...