Как удалить одно значение из массива в Ruby? - PullRequest
2 голосов
/ 19 марта 2019

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

arr = [1,2,3,1,2,3]
arr.reject {|i| i == arr.min}
#=> [2,3,2,3]

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

[...]
#=> [2,3,1,2,3]

Какое самое элегантное решение этой проблемы?

Ответы [ 3 ]

3 голосов
/ 19 марта 2019

На первый взгляд, вот несколько вариантов:

arr.delete_at(arr.index(arr.min))
# or less readable but still valid
arr.delete_at arr.index arr.min    
arr.delete_at(arr.each_with_index.min[1])
# or
arr.delete_at(arr.each_with_index.min.pop)
# or
arr.delete_at(arr.each_with_index.min.last)

Первый код меньше и более читабелен, но делает два прохода по списку вместо одного. У меня есть сомнения относительно того, превзойдет ли любая другая конструкция элегантность первого варианта, какой бы ужасной она ни была (или не может быть?).

Обратите внимание, что оба варианта аварийно завершают работу на пустом массиве. Вот более безопасная версия:

arr.delete_at arr.index(arr.min) || 0
1 голос
/ 19 марта 2019

Вы можете использовать Enumerable#drop_while для этой цели

arr = [1,2,3,1,2,3]
arr.drop_while { |i| i == arr.min }
#=> [2, 3, 1, 2, 3]
1 голос
/ 19 марта 2019

Просто из любопытства:

[1,2,3,1,2,3].tap { |a| a.delete_at a.each_with_index.min.last }
#⇒ [2, 3, 1, 2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...