2009-03-02 4 views
29

Ich brauche eine Sammlung, die wie ein Set ist. Im Grunde scanne ich eine lange Zeichenfolge und füge der Sammlung Wörter hinzu, möchte aber feststellen können, wenn Dubletten vorhanden sind.Sets in Ruby?

Wenn Sätze nicht verfügbar sind, was ist der effizienteste Weg, dies in Ruby zu tun? Brownie zeigt zum Beispiel Code.

Antwort

16

Vom documentation:

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

Gibt es etwas Ähnliches, das mir sagt, dass es Duplikate im Array gibt? Oder hat uniq irgendeinen Rückgabewert? – alamodey

+3

uniq: Gibt ein neues Array zurück, indem doppelte Werte in self entfernt werden. uniq !: Entfernt doppelte Elemente von self. Gibt null zurück, wenn keine Änderungen vorgenommen werden (dh keine Duplikate gefunden werden). – dirkgently

5

Schauen Sie sich diese URL /core/classes/Set.html über bei ruby-doc.org

+0

Der Link funktioniert nicht nicht mehr. Wurde es aus der Kern-API entfernt? – Florin

+0

Link aktualisiert ... –

60

Es gibt eine Set-Klasse in Ruby. Sie können es wie so verwenden:

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 

Obwohl, ich frage mich, wenn Sie die Instanzen in diesem Fall das folgende Beispiel besser wäre, zählen möchte:

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

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

Auf Ruby 1.9 und höher musst du nicht mehr "set" setzen, es ist schon da. Wenn du 'my_set.concat [1,2,3]' tust, werden die Dinge, die du zu dem Set hinzufügst, in ein anderes 'Set' umgewandelt: – Julik

+1

@Julik, du musst immer noch' set' setzen. – ndn