2015-03-13 7 views
3

Я пытаюсь понять, как я могу изменить массив целых чисел в массив диапазонов. Например, я хочу взять этот массив:Массив целых чисел в массив диапазонов

ar = [0, 49, 14, 30, 40, 23, 59, 101] 

в

ar = [0..49, 14..30, 40..23, 59..101] 

Учитывая массив всегда будет четным. Я хочу, чтобы каждое из двух значений было границ границ.

Я попытался разделить его на два массива. Один с нечетными индексами второй с четным.

a = ar.select.with_index{|_,i| (i+1) % 2 == 1} 
b = ar.select.with_index{|_,i| (i+1) % 2 == 0} 

Я не имею представление о том, как использовать их для создания диапазонов, и я хотел бы, чтобы избежать создания избыточных переменных, как a и b. Я не хочу сортировать значения. Диапазон 40..23 намеренно.

ответ

11
ar.each_slice(2).map { | a, b | a..b } 
+0

Идеальный ответ (у) – Salil

+0

Спасибо, это действительно кратким. – Gregy

1
new_ar = [] 

ar.each_slice(2) do |r| 
    new_ar << Range.new(r[0], r[1]) 
end 
2

Я хотел бы сделать, как @ undur_gongor предполагает, но вот еще один способ:

e = ar.to_enum 
b = [] 
loop do 
    b << (e.next..e.next) 
end 
b 
    #=> [0..49, 14..30, 40..23, 59..101] 
Смежные вопросы