2009-03-02 22 views
29

Necesito una colección que sea como un conjunto. Básicamente estoy escaneando una cadena larga y agregando palabras a la colección, pero quiero ser capaz de detectar cuando hay duplicados.Conjuntos en Ruby?

Si los conjuntos no están disponibles, ¿cuál es la forma más eficiente de hacerlo en Ruby? Brownie señala, por ejemplo, el código.

Respuesta

16

Desde el documentation:

a = [ "a", "a", "b", "b", "c" ] 
a.uniq #gets you ["a", "b", "c"] 
a.uniq.uniq! #gets you nil (no duplicates :) 
+0

¿Hay algo similar que me diga que hay duplicados en la matriz? ¿O tiene uniq algún valor de retorno? – alamodey

+3

uniq: devuelve una nueva matriz eliminando los valores duplicados en sí mismo. uniq !: Elimina elementos duplicados de uno mismo. Devuelve nil si no se realizan cambios (es decir, no se encuentran duplicados). – dirkgently

5

Salida esta url /core/classes/Set.html encima en ruby-doc.org

+0

El enlace no funciona nunca más. ¿Se eliminó de la API central? – Florin

+0

Enlace actualizado ... –

60

hay una clase situado en rubí. Se puede utilizar de este modo:

require 'set' 

set = Set.new 

string = "a very very long string" 

string.scan(/\w+/).each do |word| 
    unless set.add?(word) 
    # logic here for the duplicates 
    end 
end 

Aunque, me pregunto si se quiere contar los casos en ese caso el siguiente ejemplo podría ser mejor:

instances = Hash.new { |h, k| h[k] = 0 } 

string.scan(/\w+/).each do |word| 
    instances[word] += 1 
end 
+1

En Ruby 1.9 y versiones posteriores ya no tienes que 'requerir' set'', ya está allí. Además, cuando hagas 'my_set.concat [1,2,3]' las cosas que agregues al conjunto se lanzarán a otro 'Set' – Julik

+1

@Julik, todavía tienes que' require 'set''. – ndn