Как я могу удалить один элемент из массива по значению

У меня есть массив элементов в Ruby

[2,4,6,3,8]

Мне нужно удалить элементы со значением 3, например

Как это сделать?

Ответ 1

Думаю, я понял:

a = [2,4,6,3,8]
a.delete(3)

Ответ 2

Заимствование из Travis в комментариях, это лучший ответ:

Мне лично нравится [1, 2, 7, 4, 5] - [7], что приводит к => [1, 2, 4, 5] от irb

Я изменил его ответ, увидев, что 3 был третьим элементом в его массиве примеров. Это может привести к некоторой путанице для тех, кто не понимает, что 3 находится в позиции 2 в массиве.

Ответ 3

Другая опция:

a = [2,4,6,3,8]

a -= [3]

что приводит к

=> [2, 4, 6, 8] 

Ответ 4

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

arr = [1,3,2,44,5]
arr.delete_at(arr.index(44))

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

Может быть более простой способ. Я не говорю, что это лучшая практика, но это то, что нужно признать.

Ответ 5

Мне нравится способ -=[4], упомянутый в других ответах, для удаления элементов, значение которых равно 4.

Но есть такой способ:

irb(main):419:0> [2,4,6,3,8,6].delete_if{|i|i==6}
=> [2, 4, 3, 8]
irb(main):420:0>

упоминается где-то в разделе Основные операции массива", после того как он упоминает функцию map.

Ответ 6

Предполагая, что вы хотите удалить 3 по значению в нескольких местах в массиве, Я думаю, что рубиновый способ выполнить эту задачу будет использовать метод delete_if:

[2,4,6,3,8,3].delete_if {|x| x == 3 } 

Вы также можете использовать delete_if при удалении элементов в сценарии "массива массивов".

Надеюсь, что это разрешит ваш запрос

Ответ 7

Вы можете просто запустить:

[2,4,6,3,8].delete(3)

Ответ 8

A .delete_at(3) 3 здесь позиция.

Ответ 9

Вот несколько этапов:

require 'fruity'


class Array          
  def rodrigo_except(*values)
    self - values
  end    

  def niels_except value
    value = value.kind_of?(Array) ? value : [value]
    self - value
  end
end

ARY = [2,4,6,3,8]

compare do
  soziev  { a = ARY.dup; a.delete(3);               a }
  steve   { a = ARY.dup; a -= [3];                  a }
  barlop  { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
  rodrigo { a = ARY.dup; a.rodrigo_except(3);         }
  niels   { a = ARY.dup; a.niels_except(3);           }
end

# >> Running each test 4096 times. Test will take about 2 seconds.
# >> soziev is similar to barlop
# >> barlop is faster than steve by 2x ± 1.0
# >> steve is faster than rodrigo by 4x ± 1.0
# >> rodrigo is similar to niels

И снова с большим массивом, содержащим много дубликатов:

class Array          
  def rodrigo_except(*values)
    self - values
  end    

  def niels_except value
    value = value.kind_of?(Array) ? value : [value]
    self - value
  end
end

ARY = [2,4,6,3,8] * 1000

compare do
  soziev  { a = ARY.dup; a.delete(3);               a }
  steve   { a = ARY.dup; a -= [3];                  a }
  barlop  { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
  rodrigo { a = ARY.dup; a.rodrigo_except(3);         }
  niels   { a = ARY.dup; a.niels_except(3);           }
end

# >> Running each test 16 times. Test will take about 1 second.
# >> steve is faster than soziev by 30.000000000000004% ± 10.0%
# >> soziev is faster than barlop by 50.0% ± 10.0%
# >> barlop is faster than rodrigo by 3x ± 0.1
# >> rodrigo is similar to niels

И еще больше с большим количеством дубликатов:

class Array          
  def rodrigo_except(*values)
    self - values
  end    

  def niels_except value
    value = value.kind_of?(Array) ? value : [value]
    self - value
  end
end

ARY = [2,4,6,3,8] * 100_000

compare do
  soziev  { a = ARY.dup; a.delete(3);               a }
  steve   { a = ARY.dup; a -= [3];                  a }
  barlop  { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
  rodrigo { a = ARY.dup; a.rodrigo_except(3);         }
  niels   { a = ARY.dup; a.niels_except(3);           }
end

# >> Running each test once. Test will take about 6 seconds.
# >> steve is similar to soziev
# >> soziev is faster than barlop by 2x ± 0.1
# >> barlop is faster than niels by 3x ± 1.0
# >> niels is similar to rodrigo

Ответ 10

Я улучшил решение Нильса

class Array          
  def except(*values)
    self - values
  end    
end

Теперь вы можете использовать

[1, 2, 3, 4].except(3, 4) # return [1, 2]
[1, 2, 3, 4].except(4)    # return [1, 2, 3]

Ответ 11

Вы можете также обезглавить его. Я никогда не понимал, почему Ruby имеет метод except для Hash, но не для Array:

class Array
  def except value
    value = value.kind_of(Array) ? value : [value]
    self - value
  end
end

Теперь вы можете сделать:

[1,3,7,"436",354,nil].except(354) #=> [1,3,7,"436",nil]

Или:

[1,3,7,"436",354,nil].except([354, 1]) #=> [3,7,"436",nil]

Ответ 12

Поэтому, когда у вас есть несколько вхождений 3, и вы хотите удалить только первое вхождение из 3, вы можете просто сделать что-то, как показано ниже.

arr = [2, 4, 6, 3, 8, 10, 3, 12]

arr.delete_at arr.index 3

#This will modify arr as [2, 4, 6, 8, 10, 3, 12] where first occurrence of 3 is deleted. Returns the element deleted. In this case => 3.

Ответ 13

Если вы также хотите сделать эту операцию удаления цепочкой, чтобы вы могли удалить какой-либо элемент и продолжить операции цепочки в результирующем массиве, используйте tap:

[2, 4, 6, 3, 8].tap { |ary| ary.delete(3) }.count #=> 4

Ответ 14

Неразрушающее удаление первого появления:

a = [2, 4, 6, 3, 8]
n = a.index 3
a.take(n)+a.drop(n+1)