Eliminar elementos duplicados de la matriz en Ruby


Tengo una matriz Ruby que contiene elementos duplicados.

array = [1,2,2,1,4,4,5,6,7,8,5,6]

¿Cómo puedo eliminar todos los elementos duplicados de esta matriz mientras conservo todos los elementos únicos sin usar bucles for e iteración?

Author: Steven Vascellaro, 2011-12-03

6 answers

array = array.uniq

El método uniq elimina todos los elementos duplicados y conserva todos los elementos únicos en la matriz.

Una de las muchas bellezas del lenguaje Rubí.

 619
Author: Mithun Sasidharan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-10 05:11:00

También puede devolver la intersección.

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

Esto también eliminará duplicados.

 73
Author: jaredsmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 22:53:29

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 tiene una matriz de claves como esta:

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

Y quieres saber cuáles son los archivos únicos, puedes encontrarlo con:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last }
 41
Author: maprihoda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-10 12:03:50

Si alguien estaba buscando una manera de eliminar todas las instancias de valores repetidos, vea esta pregunta.

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]
 13
Author: user495470,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:45

Solo 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]
 10
Author: Finks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-06 05:19:27

Pruebe con el operador XOR 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
 0
Author: Santosh Mohanty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-02 08:53:34