Динамично создайте массивы в Ruby

Проверьте проект CDT Eclipse. Это - плагин для Eclipse, приспособленного к разработке C/C++, и включает довольно многофункциональную проекцию отладки (который негласно использует GDB). Это доступно на большом разнообразии платформ.

5
задан michaelmichael 1 December 2009 в 22:38
поделиться

6 ответов

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 для определения цикла а затем разыменовать элементы массива с помощью счетчика, каждый из которых является гораздо более удобным способом перебора коллекции.

7
ответ дан 13 December 2019 в 22:09
поделиться

Команда "push" добавляет элементы в конец массива.

Ruby Docs-> Array-> push

2
ответ дан 13 December 2019 в 22:09
поделиться

Так или иначе, вам нужна более мощная структура данных.

Ваш пост тяготеет к идее, что 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
1
ответ дан 13 December 2019 в 22:09
поделиться

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
0
ответ дан 13 December 2019 в 22:09
поделиться
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

Удалите комментарий, если вы хотите, чтобы входные строки преобразовывались в числа

0
ответ дан 13 December 2019 в 22:09
поделиться

Это решение предполагает, что никогда не будет повторяющегося названия книги. Я полагаю, это довольно безопасно, да?

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
0
ответ дан 13 December 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: