Другие способы преобразования части массива в подмассив в Ruby?

#arrays #ruby

#массивы #ruby

Вопрос:

При разборе CSV-файла мне нужно объединить поля строки в массив, начиная с 4-го поля (3-й элемент массива). Я хочу манипулировать каждой строкой, как в примере ниже: Исходный массив:

 array1 = [1,2,3,4,5]
  

Изменен массив:

 array2 = [1,2,3,[4,5]]
  

Мой код здесь:

 array1[0..2].push(array1[3..array1.length])

=> [1, 2, 3, [4, 5]]
  

Мой вопрос: есть ли лучший / более чистый / простой способ преобразовать часть массива в подмассив?

Ответ №1:

Есть! Вы можете сделать это a = a[0..2] [a[3..-1]] . В ruby может использоваться для объединения массивов. Кроме того, n..-1 предоставляет вам элементы n в конец массива. В качестве предостережения, это медленнее и дороже, чем concat поэтому, если бы вы сделали a[0..2].concat([a[3..-1]) , это было бы дешевле и быстрее.

Комментарии:

1. На самом деле, я только что понял, что мне нужно, чтобы результирующий массив был таким; ["1", "2", "3", [4, 5]] — преобразовать строку в целое число для подмассива. Используя ваше предложение, мой код выглядит следующим образом:

2. a = ["1","2","3","4","5"] a = a[0..2].concat([a[3..-1].map(amp;:to_i)]) можно ли это улучшить? Извините, я, кажется, могу отредактировать этот комментарий

3. Что означает «дешевле» в «дешевле и быстрее»? Вы также могли бы написать a[0..2] << a[3..-1] .

4. Кстати, читайте профиль @Cary Awesome 😉 не могли бы вы прокомментировать мой комментарий? есть ли лучший способ преобразовать подмассив в целые числа? a = ["1","2","3","4","5"] a = a[0..2].concat([a[3..-1].map(amp;:to_i)]) кажется, в Ruby всегда есть другой способ.

5. @CarySwoveland «дешевле» означает меньшую нагрузку на память. a b создает новый массив, поэтому трем массивам выделена память, тогда как a.concat(b) объединяется b в a , поэтому память выделена только двум массивам. Быстрее означает, что он выполняется быстрее.