2011-12-03 15 views

Respuesta

574
array = array.uniq 

El uniq method elimina todos los elementos duplicados y retiene todos los elementos únicos de la matriz.

Una de las muchas bellezas del lenguaje Ruby.

+73

O en este caso simplemente '' array.uniq que trabaja en su lugar!. – cvshepherd

+38

no, el uniq! el método devolverá nil si el conjunto hubiera sido único aún Ej .: a = [1,2,3,4] a.uniq -> [1,2,3,4] pero a.uniq! -> nil – duykhoa

+12

realmente no vería esto como una belleza del lenguaje rubí ... ¿es solo la belleza de la biblioteca estándar de rubí? no me malinterpreten, hay muchas cosas bonitas sobre el idioma. –

41

Puede eliminar los elementos duplicados con el método uniq:

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

Lo que también podría ser útil saber es que el método uniq toma un bloque, por lo que por ejemplo, si una tiene un conjunto de teclas como este :

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

y quiere saber cuáles son los archivos únicos, se puede encontrar con:

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

Estoy un poco confundido por esto. El bloque se usa si necesita su propia función de comparación: en su ejemplo, enviar 'uniq' a esa matriz sin un bloque devolvería el mismo valor que con su bloque. – hdgarrood

+0

@hdgarrood sí, tienes razón, no me di cuenta; ver mi respuesta actualizada – maprihoda

12

Si alguien estaba buscando una forma de eliminar todas las instancias de valores repetidos, consulte 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 podría simplemente hacer 'a = [1, 2, 2, 3] a.find_all {| x | a.count (x) == 1} # [1, 3] ' –

71

También puede devolver la intersección.

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

Esto también eliminará duplicados.

+9

Funcionalmente, esta respuesta es correcta, pero creo que esto es notablemente menos legible que el simple uso de uniq. –

+16

Lo estaba poniendo aquí, así que quien visite esta página verá otras formas de hacerlo, no estaba tratando de decir que es mejor de ninguna manera. – jaredsmith

+3

La razón por la que esto funciona es porque cuando se usan operaciones de conjunto, la matriz resultante se trata como un conjunto, que es una estructura de datos que generalmente no tiene valores de repetición. Usando 'a | a' (unión) haría el mismo truco. – Cezar

8

Simplemente otra alternativa si a alguien le importa.

También puede usar el método to_set de una matriz que convierte la matriz en un conjunto y, por definición, los elementos de conjunto son únicos.

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

Esta es una clase muy general de problema con muchas variaciones. La premisa, sin embargo, permanece igual. La matriz de entrada consta de enteros, algunos de los cuales pueden duplicarse. Se supone que debemos imprimir todos los números únicos presentes en esa matriz.

Check the complete implementation here

0

intento con XOR Operador en 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 
Cuestiones relacionadas