Как напечатать все пары ключ-значение в хэше Ruby? - PullRequest
0 голосов
/ 12 апреля 2019

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

Я установил хэш с некоторыми предопределенными значениями.Я хочу попросить пользователя ввести, если этот вход совпадает с существующим ключом, я хочу, чтобы соответствующее значение было обновлено (+ 1, в этом случае).Затем я хочу напечатать все текущие текущие значения.

hash = {"apple": 6, "banana": 2, "carrot": 3}

order = gets.chomp.downcase

hash.each do |key, value|
    if key.to_s == order
       value += 1
       puts "Your order includes: #{value} #{key}."   
    end
end

Моя проблема в том, что я знаю, как печатать только одну пару значений ключа.

Например, если пользовательвходы "яблоко", я хотел бы, чтобы на выходе было сказано: "Ваш заказ включает: 7 яблок, 2 банана, 3 моркови".

Ответы [ 3 ]

3 голосов
/ 12 апреля 2019
hash = {apple: 6, banana: 2, carrot: 3}
order = gets.chomp.downcase.to_sym
hash[order] = hash.fetch(order, 0) + 1
puts "Your order includes: " + hash.map { |k, v| "#{v} #{k}" }.join(", ")

Некоторые примечания:

  • ваша инициализация хеша hash = {"apple": 6, "banana": 2, "carrot": 3}.ключи вашего хэша кажутся строками, но если вы используете этот синтаксис с двоеточием, они становятся символами.Итак, у вас есть два варианта.этот синтаксис:

    hash = {"apple" => 6, "banana" => 2, "carrot" => 3}
    

    или вы можете использовать символы, как я, и конвертировать пользовательский ввод в символ

  • что действительно здорово в хэше, так это то, что вы неНе нужно перебирать элементы, чтобы найти то, что вы ищете.Существует соответствие между ключами и значениями, поэтому легко найти и обновить значение

  • в третьей строке, я имею в виду тот факт, что ключ не может быть в хэше,Я использовал fetch, чтобы иметь 0 в этом случае.затем я увеличиваю и возвращаю эту клавишу

1 голос
/ 12 апреля 2019

Вопрос не указывает, хотите ли вы изменить исходный хеш, так что я полагаю, что вы делаете.Тогда будет сделано следующее:

hash = Hash.new(0).merge(apple: 6, banana: 2, carrot: 3)
hash[gets.chomp.downcase.to_sym] += 1

puts "Your order includes: " <<
  hash.map { |k, v| [v, k].join(' ') }.join(', ')

или:

puts hash.reduce("Your order includes: ") { |acc, (k, v)|
  acc << "#{v} #{k}, "
}[0..-3]
0 голосов
/ 12 апреля 2019

Подумайте, чтобы инициализировать хэш, предоставив значение по умолчанию ( Hash # default )

basket = {'apple' => 6, 'banana' => 2, 'carrot' => 3}
basket.default = 0 # <-- set default 0 for start counting new keys

Определите метод представления данных:

def show(basket)
  puts "Your order includes:"
  basket.each{ |key, value| puts "#{value}: #{key}" } 
end

Захват пользовательского ввода в цикле (объяснение в комментариях):

loop do
  puts "Place your order:"
  order = gets.downcase.chomp # <-- format the input
  break if order == '0' # <-- breaks the input loop if this contition is matched
  next unless basket.has_key? order # <-- skip to next loop no matches with hash keys or remove this line if you want to count also non initialised keys
  basket[order] += 1 # <-- increment by one the key
  show(basket) # <-- call the metod to show the basket
end

show(basket)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...