2011-01-19 10 views
16

En Ruby, la matriz de la resta o rejectEn Ruby, ¿hay alguna manera de eliminar solo 1 coincidencia en una matriz fácilmente?

>> [1,3,5,7,7] - [7] 
=> [1, 3, 5] 

>> [1,3,5,7,7].reject{|i| i == 7} 
=> [1, 3, 5] 

será eliminar todas las entradas de la matriz. ¿Hay un fácil de eliminar solo 1 aparición?

+1

Este está muy cerca de [ "Borrar primera instancia de elemento de juego de matriz"] (http://stackoverflow.com/questions/4595305/delete-first-instance-of-matching-element-from- formación). –

Respuesta

24
>> a = [1,3,5,7,7] 

>> a.slice!(a.index(7)) 
=> 7 

>> a 
=> [1,3,5,7] 
+2

Es posible que desee verificar que '7' realmente exista, de lo contrario puede generar un error de tipo. – lulalala

9

Lo mejor que puedo pensar es:

found = false 
[1,3,5,7,7].reject{|i| found = true if !found && i == 7} 

o destructiva:

arr = [1, 2, 3, 5, 7, 7] 
arr.delete_at(arr.index(7)) 
arr #=> [1, 2, 3, 5, 7] 
+0

similarmente: arr.slice (arr.index (7)) o arr.slice! (Arr.index (7)) – andynu

+1

@andynu: El primero no hace nada. Un 'slice!' Funciona para esto (porque pasa a hacer lo mismo que 'delete_at' cuando se llama con un argumento). – sepp2k

+1

Por cierto, en la segunda solución también puede necesitar agregar 'if pos', porque' delete_at (nil) 'arroja exeption. – Nakilon

-4

Si bien no responde directamente a su pregunta, uniq podría ser lo que quieres.

[1,3,5,7,7].uniq # => [1,3,5,7] 
+0

Esto es un poco agresivo. [1,1,1,1,2,2] .uniq # => [1,2] eliminando considerablemente más de un siete. – andynu

+0

también elimina todos los demás elementos duplicados, eso no es lo que quiere OP. – ghostdog74

+0

Bueno, dije que no respondió la pregunta :) Eso es lo que obtengo al tratar de adivinar qué es lo que * realmente * está tratando de hacer ... – zetetic

Cuestiones relacionadas