2011-12-03 13 views

risposta

574
array = array.uniq 

Il uniq method rimuove tutti gli elementi duplicati e conserva tutti gli elementi unici nella matrice.

Una delle tante bellezze del linguaggio Ruby.

+73

O in questo caso solo '' array.uniq che funziona a posto!. – cvshepherd

+38

no, l'uniq! il metodo restituirà nil se l'array fosse stato ancora unico Es: a = [1,2,3,4] a.uniq -> [1,2,3,4] ma a.uniq! -> nil – duykhoa

+12

non lo vedrei davvero come una bellezza del linguaggio rubino ... è solo la bellezza della libreria standard ruby? non fraintendetemi, ci sono molte cose belle sulla lingua. –

41

È possibile rimuovere gli elementi duplicati con il metodo uniq:

array.uniq # => [1, 2, 4, 5, 6, 7, 8] 

Che potrebbe anche essere utile sapere è che il metodo uniq prende un blocco, quindi ad esempio se un dispone di una serie di chiavi come questo :

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"] 

e volete sapere quali sono i file unici, si può trovare con:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last } 
+5

Sono un po 'confuso da questo. Il blocco viene utilizzato se è necessaria la propria funzione di confronto: nell'esempio, l'invio di 'uniq' a quell'array senza un blocco restituisce lo stesso valore del blocco. – hdgarrood

+0

@hdgarrood sì, hai ragione, non me ne sono accorto; vedere la mia risposta aggiornata – maprihoda

12

Se qualcuno stava cercando un modo per rimuovere tutte le istanze di valori ripetuti, vedere this question.

a = [1, 2, 2, 3] 
counts = Hash.new(0) 
a.each { |v| counts[v] += 1 } 
p counts.select { |v, count| count == 1 }.keys # [1, 3] 
+0

O potrebbe semplicemente fare 'a = [1, 2, 2, 3] a.find_all {| x | a.count (x) == 1} # [1, 3] ' –

71

È inoltre possibile restituire l'intersezione.

a = [1,1,2,3] 
a & a 

Questo eliminerà anche i duplicati.

+9

Funzionalmente, questa risposta è corretta, ma penso che sia nettamente meno leggibile rispetto all'uso di uniq. –

+16

Lo stavo mettendo qui così chiunque visiti questa pagina vedrà altri modi di farlo, non stavo cercando di dire che è meglio in alcun modo. – jaredsmith

+3

Il motivo per cui questo funziona è perché quando si usano le operazioni set, l'array risultante viene trattato come un set, che è una struttura dati che di solito non ha valori ripetuti. Usando 'a | a' (unione) farebbe lo stesso trucco. – Cezar

8

Solo un'altra alternativa se qualcuno se ne importa.

È inoltre possibile utilizzare il metodo to_set di un array che converte l'array in un set e, per definizione, gli elementi set sono univoci.

[1,2,3,4,5,5,5,6].to_set => [1,2,3,4,5,6] 
0

Questa è una classe molto generale di problemi con molte varianti. La premessa tuttavia rimane la stessa. L'array di input è costituito da numeri interi, alcuni dei quali potrebbero essere duplicati. Dovremmo stampare tutti i numeri unici presenti in quell'array.

Check the complete implementation here

0

Prova con XOR Operatore in Ruby:

a = [3,2,3,2,3,5,6,7].sort! 

result = a.reject.with_index do |ele,index| 
    res = (a[index+1]^ele) 
    res == 0 
end 

print result 
Problemi correlati