Проверьте проект CDT Eclipse. Это - плагин для Eclipse, приспособленного к разработке C/C++, и включает довольно многофункциональную проекцию отладки (который негласно использует GDB). Это доступно на большом разнообразии платформ.
weekly_sales = {}
puts 'Please enter a list of books'
book_list = gets.chomp
books = book_list.split(',')
books.each do |book|
puts "Please input weekly sales of #{book} separated by a comma."
weekly_sales[book] = gets.chomp.split(',')
end
В рубине есть понятие хеша, который представляет собой ключ / значение. пара. В этом случае weekly_sales - это хэш, мы используем название книги в качестве ключа, а массив в качестве значения.
Небольшое изменение, которое я внес в ваш код, - это вместо того, чтобы делать books.count.times для определения цикла а затем разыменовать элементы массива с помощью счетчика, каждый из которых является гораздо более удобным способом перебора коллекции.
Так или иначе, вам нужна более мощная структура данных.
Ваш пост тяготеет к идее, что weekly_sales
будет массивом, аналогичным книгам
массив. Недостатком этого подхода является то, что вы должны поддерживать параллелизм этих двух массивов самостоятельно.
Несколько лучшее решение - использовать название книги в качестве ключа к хеш-функции массивов, как предлагалось в нескольких ответах. Например: weekly_sales ['451 по Фаренгейту']
будет содержать массив данных о продажах этой книги. Этот подход основан на уникальности названий книг и имеет другие недостатки.
Более надежный подход, который вы, возможно, захотите рассмотреть, состоит в том, чтобы объединить информацию о каждой книге в один пакет.
Самый простой конец спектр будет списком хэшей. Каждая книга будет автономным блоком в следующих направлениях:
books = [
{
'title' => 'Fahrenheit 451',
'sales' => [1,2,3],
},
{
'title' => 'Slaughterhouse-Five',
'sales' => [123,456],
},
]
puts books[1]['title']
На другом конце спектра будет создание надлежащего класса Book
.
Промежуточный подход будет заключаться в использовании класса Struct
(или OpenStruct
), который занимает золотую середину между хешами и полноценными объектами. Например:
# Define the attributes that a Book will have.
Book = Struct.new(:title, :weekly_sales)
books = []
# Simulate some user input.
books_raw_input = "Fahrenheit 451,Slaughterhouse-Five\n"
sales_raw_input = ['1,2,3', '44,55,66,77']
books_raw_input.chomp.split(',').each do |t|
ws = sales_raw_input.shift.split(",")
# Create a new Book.
books.push Book.new(t, ws)
end
# Now each book is a handy bundle of information.
books.each do |b|
puts b.title
puts b.weekly_sales.join(', ')
end
Are вы счастливы получить массив массивов? В чем это может быть полезно:
book_sales = books_array.collect do |book|
puts "Please input weekly sales of #{books_array[0]} separated by a comma."
gets.chomp.split(",").collect{ |s| s.to_i }
end
Глядя на это, вы можете предпочесть хэш, введенный по книге. Примерно так:
book_sales = books_array.inject({}) do |hash, book|
puts "Please input weekly sales of #{books_array[0]} separated by a comma."
weekly_sales = gets.chomp.split(",").collect{ |s| s.to_i }
hash[book] = weekly_sales
end
result = "The Great Gatsby, Crime and Punishment, Dracula, Fahrenheit 451,
Pride and Prejudice, Sense and Sensibility, Slaughterhouse-Five,
The Adventures of Huckleberry Finn".split(/,\s*/).map do |b|
puts "Please input weekly sales of #{b} separated by a comma."
gets.chomp.split(',') # .map { |e| e.to_i }
end
p result
Удалите комментарий, если вы хотите, чтобы входные строки преобразовывались в числа
Это решение предполагает, что никогда не будет повторяющегося названия книги. Я полагаю, это довольно безопасно, да?
input = "A list of words"
hash = {}
input.split(/\s+/).collect { |word| hash[word] = [] }
# Now do whatever with each entry
hash.each do |word,ary|
ary << ...
end