Ich persönlich mag [1, 2, 3, 4, 5] - [3]die Ergebnisse in => [1, 2, 4, 5]aus irb.
Travis
24
Was ist, wenn es mehrere Einträge von 3 gibt und wir nur einen von ihnen löschen wollten? (Dies ist verwandt, so dass es am besten ist, dies hier zu fragen)
Navneet
113
Nur ein Hinweis darauf, dass .delete () den gelöschten Wert zurückgibt, nicht das geänderte Array, bei dem der Wert entfernt wurde.
Joshua Pinter
23
Die andere zu berücksichtigende Konsequenz ist, dass deletedas zugrunde liegende Array mutiert wird, während -ein neues Array (das an Sie zurückgegeben wird) ohne den gelöschten Wert erstellt wird. Abhängig von Ihrem Anwendungsfall kann jeder Ansatz sinnvoll sein.
srt32
2
@ user3721428, delete (3) bezieht sich nicht auf das Element in Position 3, sondern löscht stattdessen alle Elemente, die mit der Ganzzahl 3 übereinstimmen. Es entfernt alle Vorkommen von 3 und hat nichts mit dem Index oder der Position des Arrays zu tun.
bkunzi01
226
In Anlehnung an Travis in den Kommentaren ist dies eine bessere Antwort:
Ich persönlich mag , [1, 2, 7, 4, 5] - [7]welche Ergebnisse in => [1, 2, 4, 5]vonirb
Ich habe seine Antwort dahingehend geändert, dass 3 das dritte Element in seinem Beispielarray ist. Dies könnte zu Verwirrung bei denjenigen führen, die nicht erkennen, dass sich 3 im Array auf Position 2 befindet.
Wie srt32 in der Antwort hervorhebt, gibt es einen wichtigen Unterschied zwischen der Verwendung von .deleteund -. .deletegibt den Wert zurück, der aus dem Array entfernt wurde, falls vorhanden; -wird nicht. Also [ 1, 2, 3 ] - [ 2 ]wird zurückkehren [ 1, 3 ], während [ 1, 2, 3 ].delete( 2 )wird zurückkehren 2.
Argus9
5
array - subArrayfunktioniert nicht für Array of Arrays , reicht aber aus array.delete(subArray).
Sachin
20
Der sehr wichtige Unterschied zwischen [1,2,3] - [2]und [1,2,3].delete(2)besteht darin, dass die deleteMethode das ursprüngliche Array ändert und gleichzeitig [1,2,3] - [3]ein neues Array erstellt .
Timothy Kovalev
Re Subarrays (@ Sachins Kommentar oben) "Sicher wird es", müssen Sie nur die Notation richtig machen: [1,2,[2],2,3,4] - [2]gibt Ihnen [1, [2], 3, 4], aber [1,2,[2],2,3,4] - [[2]]gibt Ihnen [1, 2, 2, 3, 4]. :-)
Ich bin nicht sicher, ob jemand dies angegeben hat, aber Array.delete () und - = value löschen jede Instanz des Wertes, der innerhalb des Arrays an ihn übergeben wurde. Um die erste Instanz des jeweiligen Elements zu löschen, können Sie so etwas tun
Ich habe nach einer Möglichkeit gesucht, dies zu tun und nur eine Instanz des Elements zu löschen, falls Duplikate vorhanden sind, und dies funktioniert hervorragend!
Xeroshogun
Ich denke, diese Antwort ist falsch, einfach weil arr.index () gehen könntenil
windmaomao
32
Angenommen, Sie möchten 3 nach Wert an mehreren Stellen in einem Array löschen. Ich denke, die rubinrote Methode für diese Aufgabe wäre die Verwendung der Methode delete_if:
[2,4,6,3,8,3].delete_if {|x| x ==3}
Sie können delete_if auch zum Entfernen von Elementen im Szenario 'Array of Arrays' verwenden.
@Zac natürlich , aber diese Antwort bereits erwähnt wurde (ebenso wie die sehr prägnante -=Art und Weise , a-=[4]dh a=a-[4]. [3,4]-[4], Die ich sagte , ich möchte), aber ich wollte eine andere Art und Weise , ganz zu schweigen.
Barlop
Diese Methode hat auch den Vorteil, dass das Array anstelle des gelöschten Elements zurückgegeben wird.
require 'fruity'classArraydef rodrigo_except(*values)self- values
enddef niels_except value
value = value.kind_of?(Array)? value :[value]self- value
endend
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
Und wieder mit einem größeren Array, das viele Duplikate enthält:
classArraydef rodrigo_except(*values)self- values
enddef niels_except value
value = value.kind_of?(Array)? value :[value]self- value
endend
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
Und noch größer mit mehr Duplikaten:
classArraydef rodrigo_except(*values)self- values
enddef niels_except value
value = value.kind_of?(Array)? value :[value]self- value
endend
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
Ihre Lösung funktioniert nicht auf der irbKonsole 2.2.1 :007 > [1, 2, 3, 4].except(3, 4) NoMethodError: undefined method except for [1, 2, 3, 4]:Array from (irb):7 from /usr/share/rvm/rubies/ruby-2.2.1/bin/irb:11:in <main>
Hgsongra
1
Um in IRB zu deklarieren, müssen Sie die Methode zu Array hinzufügen class Array; def except(*values); self - values; end; end.
Mark Swardstrom
3
Sie können es auch mit Affen patchen. Ich habe nie verstanden, warum Ruby eine exceptMethode hat, Hashaber nicht für Array:
classArraydef except value
value = value.kind_of(Array)? value :[value]self- value
endend
Du brauchst den value.kind_of(Array)Test nicht. Einfach benutzen self - Array(value).
Sasgorilla
3
Wenn Sie also mehrere Vorkommen von 3 haben und nur das erste Vorkommen von 3 löschen möchten, können Sie einfach Folgendes tun.
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.
Wenn Sie diesen Löschvorgang auch verkettbar machen möchten, damit Sie einige Elemente löschen und die Verkettungsvorgänge für das resultierende Array fortsetzen können, verwenden Sie tap:
Kompilieren aller verschiedenen Optionen zum Löschen in Ruby
Löschen - Löscht übereinstimmende Elemente nach Wert. Wenn mehr als ein Wert übereinstimmt, werden alle entfernt. Verwenden Sie diese Methode, wenn Sie sich nicht für die Anzahl der Vorkommen interessieren oder sich nicht sicher sind, ob sie einmal auftreten.
a =[2,6,3,5,3,7]
a.delete(3)# returns 3
puts a # return [2, 6, 5, 7]
delete_at - Löscht das Element am angegebenen Index. Wenn Sie den Index kennen, verwenden Sie diese Methode.
# continuing from the above example
a.delete_at(2)# returns 5
puts a # returns [2, 6, 7]
delete_if - Löscht jedes Element, für das ein Block wahr ist. Dadurch wird das Array geändert. Das Array ändert sich sofort, wenn der Block aufgerufen wird.
b =[1,2,5,4,9,10,11]
b.delete_if {|n| n >=10}.# returns [1, 2, 5, 4, 9]
ablehnen - Dies gibt ein neues Array mit den Elementen zurück, für die der angegebene Block falsch ist. Die Bestellung bleibt dabei erhalten.
c =[1,2,5,4,9,10,11]
c.reject {|n| n >=10}.# returns [1, 2, 5, 4, 9]
ablehnen! - wie delete_if . Das Array ändert sich möglicherweise nicht sofort, wenn der Block aufgerufen wird.
Wenn Sie mehrere Werte aus dem Array löschen möchten, ist die beste Option wie folgt.
a =[2,3,7,4,6,21,13]
b =[7,21]
a = a - b # a - [2, 3, 4, 6, 13]
delete
array.delete(3)
nicht innerhalb von Ruby on Rails Controlleractive record
Methode zurückzuführen seindelete
Antworten:
Ich glaube, ich habe es herausgefunden:
quelle
[1, 2, 3, 4, 5] - [3]
die Ergebnisse in=> [1, 2, 4, 5]
ausirb
.delete
das zugrunde liegende Array mutiert wird, während-
ein neues Array (das an Sie zurückgegeben wird) ohne den gelöschten Wert erstellt wird. Abhängig von Ihrem Anwendungsfall kann jeder Ansatz sinnvoll sein.In Anlehnung an Travis in den Kommentaren ist dies eine bessere Antwort:
Ich habe seine Antwort dahingehend geändert, dass 3 das dritte Element in seinem Beispielarray ist. Dies könnte zu Verwirrung bei denjenigen führen, die nicht erkennen, dass sich 3 im Array auf Position 2 befindet.
quelle
.delete
und-
..delete
gibt den Wert zurück, der aus dem Array entfernt wurde, falls vorhanden;-
wird nicht. Also[ 1, 2, 3 ] - [ 2 ]
wird zurückkehren[ 1, 3 ]
, während[ 1, 2, 3 ].delete( 2 )
wird zurückkehren2
.array - subArray
funktioniert nicht für Array of Arrays , reicht aber ausarray.delete(subArray)
.[1,2,3] - [2]
und[1,2,3].delete(2)
besteht darin, dass diedelete
Methode das ursprüngliche Array ändert und gleichzeitig[1,2,3] - [3]
ein neues Array erstellt .[1,2,[2],2,3,4] - [2]
gibt Ihnen[1, [2], 3, 4]
, aber[1,2,[2],2,3,4] - [[2]]
gibt Ihnen[1, 2, 2, 3, 4]
. :-)Andere Option:
was in ... resultiert
quelle
Ich bin nicht sicher, ob jemand dies angegeben hat, aber Array.delete () und - = value löschen jede Instanz des Wertes, der innerhalb des Arrays an ihn übergeben wurde. Um die erste Instanz des jeweiligen Elements zu löschen, können Sie so etwas tun
Es könnte einen einfacheren Weg geben. Ich sage nicht, dass dies eine bewährte Methode ist, aber es ist etwas, das anerkannt werden sollte.
quelle
nil
Angenommen, Sie möchten 3 nach Wert an mehreren Stellen in einem Array löschen. Ich denke, die rubinrote Methode für diese Aufgabe wäre die Verwendung der Methode delete_if:
Sie können delete_if auch zum Entfernen von Elementen im Szenario 'Array of Arrays' verwenden.
Hoffe, dies löst Ihre Anfrage
quelle
Ich mag die
-=[4]
in anderen Antworten erwähnte Methode, um die Elemente zu löschen, deren Wert 4 ist.Aber es gibt diesen Weg:
irgendwo in " Basic Array Operations " erwähnt, nachdem die
map
Funktion erwähnt wurde.quelle
.delete(6)
-=
Art und Weise ,a-=[4]
dha=a-[4]
.[3,4]-[4]
, Die ich sagte , ich möchte), aber ich wollte eine andere Art und Weise , ganz zu schweigen.Sie können einfach ausführen:
quelle
A
.delete_at(3)
3
hier ist die Position.quelle
Hier einige Benchmarks:
Und wieder mit einem größeren Array, das viele Duplikate enthält:
Und noch größer mit mehr Duplikaten:
quelle
Ich habe Niels 'Lösung verbessert
Jetzt können Sie verwenden
quelle
irb
Konsole2.2.1 :007 > [1, 2, 3, 4].except(3, 4) NoMethodError: undefined method except for [1, 2, 3, 4]:Array from (irb):7 from /usr/share/rvm/rubies/ruby-2.2.1/bin/irb:11:in <main>
class Array; def except(*values); self - values; end; end
.Sie können es auch mit Affen patchen. Ich habe nie verstanden, warum Ruby eine
except
Methode hat,Hash
aber nicht fürArray
:Jetzt können Sie Folgendes tun:
Oder:
quelle
value.kind_of(Array)
Test nicht. Einfach benutzenself - Array(value)
.Wenn Sie also mehrere Vorkommen von 3 haben und nur das erste Vorkommen von 3 löschen möchten, können Sie einfach Folgendes tun.
quelle
Zerstörungsfreie Beseitigung des ersten Auftretens:
quelle
Wenn Sie diesen Löschvorgang auch verkettbar machen möchten, damit Sie einige Elemente löschen und die Verkettungsvorgänge für das resultierende Array fortsetzen können, verwenden Sie
tap
:quelle
Kompilieren aller verschiedenen Optionen zum Löschen in Ruby
quelle