Переместить элементы массива в другой массив в Ruby

Простой рубиновый вопрос. Допустим, у меня есть массив из 10 строк, и я хочу переместить элементы в массиве [3] и массиве [5] в совершенно новый массив. Новый массив будет иметь только два элемента, которые я переместил из первого массива. И первый массив будет иметь только 8 элементов, поскольку два из них были перемещены.

5 ответов

Используйте Array#slice!, чтобы удалить элементы из первого массива и добавить их ко второму массиву с помощью Array#<< :

arr1 = ['Foo', 'Bar', 'Baz', 'Qux'] arr2 = [] arr2 << arr1.slice!(1) arr2 << arr1.slice!(2) puts arr1.inspect puts arr2.inspect

Вывод:

["Foo", "Baz"]
["Bar", "Qux"]

В зависимости от вашей конкретной ситуации вы можете найти другие методы в массиве еще более полезными, например Enumerable#partition:

arr = ['Foo', 'Bar', 'Baz', 'Qux']
starts_with_b, does_not_start_with_b = arr.partition{|word| word[0] == 'B'}
puts starts_with_b.inspect
puts does_not_start_with_b.inspect

Вывод:

["Bar", "Baz"]
["Foo", "Qux"]


a = (0..9).map { |i| "el##{i}" }
x = [3, 5].sort_by { |i| -i }.map { |i| a.delete_at(i) }
puts x.inspect
# => ["el#5", "el#3"]
puts a.inspect
# => ["el#0", "el#1", "el#2", "el#4", "el#6", "el#7", "el#8", "el#9"]

Как отмечено в комментариях, существует некоторая магия, чтобы индексы оставались на месте. Этого можно избежать, сначала получив все нужные элементы с помощью a.values_at(*indices), затем удалив их, как указано выше.


Код:

arr = ["null","one","two","three","four","five","six","seven","eight","nine"]
p "Array: #{arr}"
third_el = arr.delete_at(3)
fifth_el = arr.delete_at(4)
first_arr = arr
p "First array: #{first_arr}"
concat_el = third_el + "," + fifth_el
second_arr = concat_el.split(",")
p "Second array: #{second_arr}"

Вывод:

c:\temp>C:\case.rb
"Array: [\"null\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"s
even\", \"eight\", \"nine\"]"
"First array: [\"null\", \"one\", \"two\", \"four\", \"six\", \"seven\", \"eight
\", \"nine\"]"
"Second array: [\"three\", \"five\"]"


Почему бы не начать удаление из индекса максимум.

arr = ['Foo', 'Bar', 'Baz', 'Qux']
index_array = [2, 1]
new_ary = index_array.map { |index| arr.delete_at(index) }
new_ary # => ["Baz", "Bar"]
arr # => ["Foo", "Qux"]


Здесь один из способов:

vals = arr.values_at *pulls
arr = arr.values_at *([*(0...arr.size)] - pulls)

Попробуйте.

arr = %w[Now is the time for all Rubyists to code]
pulls = [3,5]
vals = arr.values_at *pulls
 #=> ["time", "all"]
arr = arr.values_at *([*(0...arr.size)] - pulls)
 #=> ["Now", "is", "the", "for", "Rubyists", "to", "code"]
arr = %w[Now is the time for all Rubyists to code]
pulls = [5,3]
vals = arr.values_at *pulls
 #=> ["all", "time"]
arr = arr.values_at *([*(0...arr.size)] - pulls)
 #=> ["Now", "is", "the", "for", "Rubyists", "to", "code"]

licensed under cc by-sa 3.0 with attribution.