Как удалить все элементы после определенного индекса - PullRequest
0 голосов
/ 30 января 2019

Учитывая:

n = 2
arr = %w(10 20 30 40 50)

Это способ удалить все элементы массива после индекса n:

arr.delete_if {|num| arr.index(num) > n }
# => ["10", "20", "30"]

Есть ли другой способ удалить все элементы измассив без перебора и сравнения условия?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Вы удаляете элементы с индексом больше n=2 и получаете остаток массива, где вы можете просто получить его как,

arr = arr[0..2]

Выше будет восстановлен новый массив, и ссылка arr будет указывать на него.

Обновление: идет немного глубже с точкой, заявленной Кэри Свовеландом в комментарии,

Массив может быть обновлен без инициализации нового следующим образом,

# This one will have same object id or we can say, do not point to new array
arr.replace(arr[0,3])  
0 голосов
/ 30 января 2019

Вы можете использовать Array#slice! для удаления элементов в пределах определенного диапазона индекса, например:

arr = %w(10 20 30 40 50)

arr.slice!(3..-1)   #=> ["40", "50"]
arr                 #=> ["10", "20", "30"]

Обратите внимание, что slice! также возвращает удаленную часть.

0 голосов
/ 30 января 2019
Оператор

Array#[]= пригодится:

arr[n+1 .. -1] = []

В Ruby 2.6 вы также можете использовать бесконечные диапазоны:

arr[n+1 ..] = []

Обратите внимание, что ваш код работает медленно, так как он ищетмассив для каждого элемента и, таким образом, O(n^2), но также неверен, если массив содержит повторяющиеся элементы.Например, с arr = %w(10 20 30 10 20) ваш код не меняет массив.Это будет ваш код, только быстрее и правильнее (O(n); хотя приведенное выше решение #[]= еще быстрее и понятнее):

arr.delete_if.with_index { |num, idx| idx > n }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...