Я хочу, чтобы сохранить year-month-day
в рубин, создавая 3D-массив, чтобы смотреть вверх O (1):Инициализирует пустой массив с высокими индексами в Ruby?
dates = [Date.new(2014,2,15), Date.new(2015, 8, 27), Date.new(2014, 7, 4), ...]
res = []
dates.each do |d|
# Init year if DNE
if res[d.year].nil?
res[d.year] = []
end
# Init month if DNE
if res[d.year][d.month].nil?
res[d.year][d.month] = []
end
# Set the [year][month][day] = 1
res[d.year][d.month][d.day] = 1
end
# Use case
def date_in_array?(date)
!res[self.year].nil? && !res[self.year][self.month].nil? && !res[self.year][self.month][self.day].nil?
end
date_in_array?(Date.new(2014, 2, 15))
=> true
date_in_array?(Date.new(2014, 9, 21))
=> false
В качестве альтернативы можно использовать хэш для сохранения даты, но он может получить дорогой с точки зрения памяти.
Так что мой вопрос в том, как рубин управляет индексом массива вне диапазона?
Я хочу убедиться, что при выполнении res[2015] = []
рубин не инициализирует набор res[0..2014]
, и это действительно хороший способ хранения данных в этом случае.
Сколько лет вам приходится покрывать? – Stefan
@Stefan Это зависит от пользователя. Обычно он может варьироваться от 5-10 лет, но нет предела. – sPaz
Вы можете записать это более компактно как 'arr = date.each_with_object ([]) {| d, a | ((a [d.year] || = []) [d.month] || = []) [d.day] = 1} 'Если' date' содержит первые три даты в вашем примере, 'arr [ 2014] [2] [15] # => 1; arr [1492] # => nil'. Заметка; 'arr.flatten.compact # => [1, 1, 1]'. (Вы не хотите использовать массивы здесь.) –