Que faire s'il y a plusieurs entrées de 3 et que nous voulions en supprimer une seule? (ceci est lié donc demander ceci ici pourrait être le meilleur)
Navneet
113
Juste un signe que .delete () renverra la valeur supprimée, pas le tableau modifié avec la valeur supprimée.
Joshua Pinter
23
L'autre conséquence à considérer est la deletemutation du tableau sous-jacent alors qu'il -crée un nouveau tableau (qui vous est retourné) sans la valeur supprimée. Selon votre cas d'utilisation, l'une ou l'autre approche peut avoir un sens.
srt32
2
@ user3721428, delete (3) ne fait pas référence à l'élément en position 3 mais supprime à la place tout élément correspondant à l'entier 3. Il supprimera toutes les occurrences de 3 et n'a rien à voir avec l'index ou la position des tableaux.
bkunzi01
226
Empruntant à Travis dans les commentaires, c'est une meilleure réponse:
J'ai modifié sa réponse en voyant que 3 était le troisième élément de son exemple de tableau. Cela pourrait entraîner une certaine confusion pour ceux qui ne réalisent pas que 3 est en position 2 dans le tableau.
Comme le souligne srt32 dans la réponse, il y a une distinction importante à faire entre l'utilisation de .deleteet -. .deleterenverra la valeur qui a été supprimée du tableau, le cas échéant; -Ne fera pas. Ainsi [ 1, 2, 3 ] - [ 2 ]reviendra [ 1, 3 ], tandis que [ 1, 2, 3 ].delete( 2 )reviendra 2.
Argus9
5
array - subArrayne fonctionnera pas pour Array of Arrays , mais fonctionnera array.delete(subArray).
Sachin
21
La différence très importante entre [1,2,3] - [2]et [1,2,3].delete(2)est que cette deleteméthode modifie le tableau d'origine , tout en [1,2,3] - [3]créant un nouveau tableau .
Timothy Kovalev
Sous-tableaux Re (commentaire de @ Sachin ci-dessus) "Bien sûr", vous avez juste besoin d'obtenir la bonne notation: [1,2,[2],2,3,4] - [2]vous donne [1, [2], 3, 4], mais [1,2,[2],2,3,4] - [[2]]vous donne [1, 2, 2, 3, 4]. :-)
Je ne sais pas si quelqu'un l'a déclaré, mais Array.delete () et - = valeur supprimera chaque instance de la valeur qui lui est transmise dans le tableau. Afin de supprimer la première instance de l'élément particulier, vous pouvez faire quelque chose comme
Je cherchais un moyen de le faire et de supprimer uniquement une instance de l'élément en cas de doublons et cela fonctionne très bien!
xeroshogun
Je pense que cette réponse est fausse, simplement parce que arr.index () pourrait disparaîtrenil
windmaomao
32
En supposant que vous vouliez supprimer 3 par valeur à plusieurs endroits dans un tableau, je pense que la façon la plus simple de faire cette tâche serait d'utiliser la méthode delete_if:
[2,4,6,3,8,3].delete_if {|x| x ==3}
Vous pouvez également utiliser delete_if pour supprimer des éléments dans le scénario de «tableau de tableaux».
Mais ne pouvez-vous pas simplement utiliser.delete(6)
Zac
@Zac bien sûr , mais cette réponse a déjà été mentionné ( tout comme la très concise -=façon à a-=[4]savoir a=a-[4]. [3,4]-[4], Que je dit que j'aimais), mais je voulais mentionner une autre façon possible.
barlop
Cette méthode présente également l'avantage de renvoyer le tableau au lieu de l'élément supprimé.
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
Et encore une fois avec un tableau plus grand contenant beaucoup de doublons:
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
Et encore plus avec plus de doublons:
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
Votre solution ne fonctionne pas sur la irbconsole 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
Pour déclarer dans IRB, vous devez ajouter la méthode à Array class Array; def except(*values); self - values; end; end.
Mark Swardstrom
3
Vous pouvez également le patcher. Je n'ai jamais compris pourquoi Ruby a une exceptméthode pour Hashmais pas pour Array:
classArraydef except value
value = value.kind_of(Array)? value :[value]self- value
endend
Vous n'avez pas besoin du value.kind_of(Array)test. Utilisez simplement self - Array(value).
Sasgorilla
3
Ainsi, lorsque vous avez plusieurs occurrences de 3 et que vous souhaitez uniquement supprimer la première occurrence de 3, vous pouvez simplement faire quelque chose comme ci-dessous.
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.
Si vous souhaitez également rendre cette opération de suppression chaînable, afin de pouvoir supprimer certains éléments et continuer de chaîner les opérations sur le tableau résultant, utilisez tap:
Compilation de toutes les différentes options de suppression dans ruby
delete - Supprime les éléments correspondants par valeur. Si plusieurs valeurs correspondent, toutes les valeurs seront supprimées. Si vous ne vous souciez pas du nombre d'occurrences ou n'êtes pas sûr d'une occurrence unique, utilisez cette méthode.
a =[2,6,3,5,3,7]
a.delete(3)# returns 3
puts a # return [2, 6, 5, 7]
delete_at - Supprime l'élément à l'index donné. Si vous connaissez l'index, utilisez cette méthode.
# continuing from the above example
a.delete_at(2)# returns 5
puts a # returns [2, 6, 7]
delete_if - Supprime chaque élément pour lequel le bloc est vrai. Cela modifiera le tableau. Le tableau change instantanément lors de l'appel du bloc.
b =[1,2,5,4,9,10,11]
b.delete_if {|n| n >=10}.# returns [1, 2, 5, 4, 9]
rejeter - Cela retournera un nouveau tableau avec les éléments pour lesquels le bloc donné est faux. La commande est maintenue avec cela.
c =[1,2,5,4,9,10,11]
c.reject {|n| n >=10}.# returns [1, 2, 5, 4, 9]
rejeter! - identique à delete_if . Le tableau peut ne pas changer instantanément lors de l'appel du bloc.
Si vous souhaitez supprimer plusieurs valeurs du tableau, la meilleure option est celle ci-dessous.
a =[2,3,7,4,6,21,13]
b =[7,21]
a = a - b # a - [2, 3, 4, 6, 13]
delete
array.delete(3)
ne fonctionne pas dans le contrôleuractive record
méthodedelete
Réponses:
Je pense que je l'ai compris:
la source
[1, 2, 3, 4, 5] - [3]
ce qui résulte=> [1, 2, 4, 5]
deirb
.delete
mutation du tableau sous-jacent alors qu'il-
crée un nouveau tableau (qui vous est retourné) sans la valeur supprimée. Selon votre cas d'utilisation, l'une ou l'autre approche peut avoir un sens.Empruntant à Travis dans les commentaires, c'est une meilleure réponse:
J'ai modifié sa réponse en voyant que 3 était le troisième élément de son exemple de tableau. Cela pourrait entraîner une certaine confusion pour ceux qui ne réalisent pas que 3 est en position 2 dans le tableau.
la source
.delete
et-
..delete
renverra la valeur qui a été supprimée du tableau, le cas échéant;-
Ne fera pas. Ainsi[ 1, 2, 3 ] - [ 2 ]
reviendra[ 1, 3 ]
, tandis que[ 1, 2, 3 ].delete( 2 )
reviendra2
.array - subArray
ne fonctionnera pas pour Array of Arrays , mais fonctionneraarray.delete(subArray)
.[1,2,3] - [2]
et[1,2,3].delete(2)
est que cettedelete
méthode modifie le tableau d'origine , tout en[1,2,3] - [3]
créant un nouveau tableau .[1,2,[2],2,3,4] - [2]
vous donne[1, [2], 3, 4]
, mais[1,2,[2],2,3,4] - [[2]]
vous donne[1, 2, 2, 3, 4]
. :-)Une autre option:
ce qui se traduit par
la source
Je ne sais pas si quelqu'un l'a déclaré, mais Array.delete () et - = valeur supprimera chaque instance de la valeur qui lui est transmise dans le tableau. Afin de supprimer la première instance de l'élément particulier, vous pouvez faire quelque chose comme
Il pourrait y avoir un moyen plus simple. Je ne dis pas que c'est la meilleure pratique, mais c'est quelque chose qui devrait être reconnu.
la source
nil
En supposant que vous vouliez supprimer 3 par valeur à plusieurs endroits dans un tableau, je pense que la façon la plus simple de faire cette tâche serait d'utiliser la méthode delete_if:
Vous pouvez également utiliser delete_if pour supprimer des éléments dans le scénario de «tableau de tableaux».
J'espère que cela résout votre question
la source
J'aime la
-=[4]
manière mentionnée dans les autres réponses pour supprimer les éléments dont la valeur est 4.Mais il y a cette façon:
mentionné quelque part dans " Basic Array Operations ", après avoir mentionné la
map
fonction.la source
.delete(6)
-=
façon àa-=[4]
savoira=a-[4]
.[3,4]-[4]
, Que je dit que j'aimais), mais je voulais mentionner une autre façon possible.Vous pouvez simplement exécuter:
la source
Un
.delete_at(3)
3
ici étant la position.la source
Voici quelques repères:
Et encore une fois avec un tableau plus grand contenant beaucoup de doublons:
Et encore plus avec plus de doublons:
la source
J'ai amélioré la solution de Niels
Vous pouvez maintenant utiliser
la source
irb
console2.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
.Vous pouvez également le patcher. Je n'ai jamais compris pourquoi Ruby a une
except
méthode pourHash
mais pas pourArray
:Vous pouvez maintenant:
Ou:
la source
value.kind_of(Array)
test. Utilisez simplementself - Array(value)
.Ainsi, lorsque vous avez plusieurs occurrences de 3 et que vous souhaitez uniquement supprimer la première occurrence de 3, vous pouvez simplement faire quelque chose comme ci-dessous.
la source
Suppression non destructive de la première occurrence:
la source
Si vous souhaitez également rendre cette opération de suppression chaînable, afin de pouvoir supprimer certains éléments et continuer de chaîner les opérations sur le tableau résultant, utilisez
tap
:la source
Compilation de toutes les différentes options de suppression dans ruby
la source