Как конвертировать числа в строке в хеш
Учитывая строку, такую как "ABCD 100"
Какой самый эффективный способ преобразовать его в {"ABCD": 100}
, где "ABCD"
это ключ и 100
такое целое число и значение?
3 ответа
Решение
Предполагая, что у вас более одной пары ключ-значение, вы можете объединить split
, each_slice
а также map
:
"ABCD 100 EFG 200".split
.each_slice(2)
.map {|k, v| [k.to_sym, v.to_i]}.to_h
#=> {:ABCD=>100, :EFG=>200}
Или с scan
и группы:
"ABCD 100 EFG 200".scan(/([A-Z]+)\s([0-9]+)/)
.map! {|k, v| [k.to_sym, v.to_i]}.to_h
#=> {:ABCD=>100, :EFG=>200}
Используйте регулярные выражения в соответствии с вашей реальной проблемой, это просто пример.
Если это точный формат, я бы сделал
key, value = "ABCD 100".split
{key.to_sym => value.to_i}
Если вы ищете однострочник
Начиная с ruby 2.4.0
["ABCD 100".split].to_h.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v.to_i }
От ruby 2.4.0
["ABCD 100".split].to_h.transform_values!(&:to_i)
Если ваш шаблон представляет собой строку типа "значение ключа", вы можете использовать String#split. Он принимает строку и возвращает массив подстрок, разделенных разделителем. Если вы не указали разделитель, по умолчанию используется пробел.
def insert_values_from_string_into_hash(to_be_parsed_string, hash)
string_key, value = to_be_parsed_string.split
hash[string_key] = value
hash
end
insert_values_from_string_into_hash("ABCD 100", {})