Cum pot șterge un element dintr-o matrice de valoare

Am o serie de elemente în Ruby

[2,4,6,3,8]

Am nevoie pentru a elimina elementele cu valoarea 3 de exemplu

Cum fac asta?

Comentarii la întrebare (2)
Soluția

Cred că m-am'am dat seama:

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

Împrumut de la Travis în comentarii, aceasta este un răspuns mai bun:

eu personal ca[1, 2, 7, 4, 5] - [7] care rezultă în => [1, 2, 4, 5] de la irb`

Am modificat raspunsul lui văzând că 3 a fost cel de-al treilea element în exemplu de matrice. Acest lucru ar putea duce la o oarecare confuzie pentru cei care don't seama că 3 este în poziția 2 în matrice.

Comentarii (4)

O altă opțiune:

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

a -= [3]

care rezultate în

=> [2, 4, 6, 8] 
Comentarii (0)

Am'm nu sunt sigur dacă cineva a afirmat acest lucru, dar Array.delete() și -= valoarea va șterge fiecare instanță de valoare transmisă către în Matrice. În scopul de a șterge primul exemplu de element particular ai putea face ceva de genul

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

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

Acolo ar putea fi un mod mai simplu. Am'nu spun acest lucru este cel mai practica, dar este ceva care ar trebui să fie recunoscute.

Comentarii (1)

Presupunând că doriți să ștergeți 3 de valoare în mai multe locuri într-o matrice, Cred că ruby mod de a face această sarcină va fi de a utiliza delete_if metoda:

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

Puteți folosi, de asemenea, delete_if în eliminarea elementelor în scenariul de 'matrice de matrice'.

Sper că acest lucru rezolvă interogare

Comentarii (0)

Îmi place -=[4] de drum menționat în alte răspunsuri pentru a șterge elemente a căror valoare este de 4.

Dar nu este în acest fel:

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

menționat undeva în "Bază Operațiuni de Matrice", după ce se menționează pe "harta" funcția.

Comentarii (3)

Puteți rula pur și simplu:

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

O .delete_at(3) 3 aici fiind poziția.

Comentarii (0)

Iată câteva repere:

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

Și din nou, cu o mai mare matrice care conține o mulțime de duplicate:

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

Și chiar mai mare, cu mai multe dubluri:

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
Comentarii (1)

Am îmbunătățit Niels's soluție

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

Acum puteți folosi

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

Puteți, de asemenea, maimuță patch-uri. N-am înțeles niciodată de ce Ruby are o afară metoda Hash dar nu pentru "Matrice":

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

Acum puteți face:

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

Sau:

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

Deci, atunci când aveți mai multe apariții de 3 și vrei doar pentru a șterge prima apariție a 3, puteți face pur și simplu ceva ca mai jos.

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.
Comentarii (0)

Dacă doriți, de asemenea, pentru a face acest lucru operațiunea de ștergere chainable, astfel încât să puteți șterge un element și țineți pe înlănțuirea operațiilor pe matrice rezultat, utilizați "robinet":

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

Non-distructive de ștergere de prima apariție:

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