Я хотел бы найти максимальное значение в массиве целых чисел, вернуть это значение и удалить его из массива. Есть ли для этого встроенная функция?

Для a = [1,2,3,4] я легко могу сделать это a.max, которое возвращает 4. Однако a[....] остается без изменений.

3
malexanders 7 Сен 2016 в 23:33

4 ответа

Лучший ответ

Вы могли бы сделать что-то подобное.

a = [1,2,3,4]
a.delete(a.max)
=> 4
a => [1, 2, 3]

Чтобы удалить один экземпляр, если есть дубликаты, вы можете использовать что-то вроде (согласно комментариям используйте a.index (a.max), чтобы получить индекс максимального значения)

a = [1, 2, 3, 4, 4]
a.delete_at(a.index(a.max))
=> 4
a => [1, 2, 3, 4]
6
user3366016 7 Сен 2016 в 22:02

Контрольные показатели:

require 'fruity'

ARY = (0..99).to_a.shuffle

compare do
  matthewalexander { a = ARY.dup; a.delete_at(a.index(a.max)) }
  sagarpandya82    { a = ARY.dup; a.sort!.pop                 }
end

# >> Running each test 512 times. Test will take about 1 second.
# >> sagarpandya82 is faster than matthewalexander by 10.000000000000009% ± 10.0%

Увеличение размера ARY изменит результаты:

ARY = (0..999_999).to_a.shuffle

compare do
  matthewalexander { a = ARY.dup; a.delete_at(a.index(a.max)) }
  sagarpandya82    { a = ARY.dup; a.sort!.pop                 }
end

# >> Running each test once. Test will take about 5 seconds.
# >> matthewalexander is faster than sagarpandya82 by 3x ± 0.1

Используйте подход, соответствующий вашим потребностям. Если вы не знаете размер массива, я бы рекомендовал предположить, что ваши данные будут расти, поскольку они так близки к небольшим массивам.

4
the Tin Man 7 Сен 2016 в 22:58

Это работает:

a.delete_at(a.index(a.max))
0
malexanders 7 Сен 2016 в 20:51

Это должно помочь:

a.sort!.pop #=> 4
2
iceツ 7 Сен 2016 в 20:47