2011-01-19 12 views
16

In Ruby, la sottrazione array o rejectIn Ruby, c'è un modo per rimuovere solo 1 partita in una matrice facilmente?

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

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

rimuoverà tutte le voci nella matrice. C'è un facile da rimuovere solo 1 ricorrenza?

+1

Questo è molto vicino al [ "Elimina prima istanza elemento corrispondenza di matrice"] (http://stackoverflow.com/questions/4595305/delete-first-instance-of-matching-element-from- array). –

risposta

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

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

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

Si potrebbe voler verificare che "7" esista effettivamente, altrimenti si potrebbe generare un errore di tipo. – lulalala

9

Il meglio che posso pensare è:

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

O distruttivo:

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

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

+1

@andynu: il primo non fa nulla. Una 'slice!' Funziona per questo (perché accade di fare la stessa cosa di 'delete_at' quando viene chiamato con un argomento). – sepp2k

+1

A proposito, nella seconda soluzione potrebbe anche essere necessario aggiungere 'se pos', perché' delete_at (nil) 'lancia l'eccezione. – Nakilon

-4

Anche se non risponde direttamente alla tua domanda, uniq potrebbe essere quello che vuoi.

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

Questo è un po 'aggressivo. [1,1,1,1,2,2] .uniq # => [1,2] rimuove considerevolmente più di un solo sette. – andynu

+0

rimuove anche tutti gli altri elementi duplicati, non è quello che l'OP vuole. – ghostdog74

+0

Beh, ho detto che non rispondeva alla domanda :) Questo è quello che ottengo per cercare di indovinare cosa l'OP * sta * veramente * cercando di fare ... – zetetic

Problemi correlati