Ich möchte die Klasse Array
um eine Methode uniq_elements
erweitern, die diese Elemente mit einer Multiplizität von eins zurückgibt. Ich möchte auch Schließungen zu meiner neuen Methode wie mit uniq
verwenden. Zum Beispiel:
Beispiel mit Schließung:
%Vor% Weder t-t.uniq
noch t.to_set-t.uniq.to_set
funktionieren. Geschwindigkeit ist mir egal, ich rufe sie nur einmal in meinem Programm auf, es kann also langsam sein.
Hilfsmethode
Diese Methode verwendet den Helfer:
%Vor%Diese Methode ähnelt Array # - . Der Unterschied wird im folgenden Beispiel veranschaulicht:
%Vor% Wie Sie sehen, enthält a
drei 3 und b
enthält zwei, also werden die ersten zwei 3 in a
beim Konstruieren von c
entfernt ( a
ist nicht mutiert) ). Wenn b
mindestens so viele Instanzen eines Elements enthält wie a
, enthält c
keine Instanzen dieses Elements. Um Elemente zu entfernen, die am Ende von a
beginnen:
Array#difference!
könnte in der offensichtlichen Weise definiert werden.
Ich habe viele Anwendungen für diese Methode gefunden: hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier , hier und hier .
Ich habe vorgeschlagen , dass diese Methode zum Ruby-Kern hinzugefügt wird.
Bei Verwendung mit Array#-
erleichtert diese Methode das Extrahieren der eindeutigen Elemente aus einem Array a
:
Das funktioniert, weil
%Vor% enthält alle nicht eindeutigen Elemente von a
(jeweils möglicherweise mehr als einmal).
Problem zur Hand
Code
%Vor%Beispiele
%Vor%Hier ist ein anderer Weg.
Code
%Vor%Beispiele
%Vor%Erläuterung
uniq_elements
mit einem Block aufgerufen wird, wird es als proc prc
. uniq_elements
ohne einen Block aufgerufen wird, prc
ist nil
, so setzt die erste Anweisung der Methode prc
auf den Standardwert proc (lambda). uniques
, enthält Darstellungen der eindeutigen Werte. Die Werte sind die eindeutigen Werte des Arrays self
, die Schlüssel werden zurückgegeben, wenn der proc prc
den Array-Wert übergeben und aufgerufen wird: k = prc[e]
. dups
enthält die Elemente des Arrays, die nicht eindeutig sind. Es ist ein Set (anstatt eines Arrays), um die Suche zu beschleunigen. Alternativ könnte ein Hash mit den nicht eindeutigen Werten als Schlüssel und beliebigen Werten vorliegen. e
des Arrays self
ausgeführt:
k = prc[e]
wird berechnet. dups
k
enthält, e
ein dup ist, muss nichts mehr getan werden; sonst uniques
einen Schlüssel k
hat, e
ein dup, so wird k
zur Menge dups
hinzugefügt und das Element mit Schlüssel k
wird aus uniques
entfernt; sonst k=>e
wird zu uniques
als Kandidat für ein eindeutiges Element hinzugefügt. unique
werden zurückgegeben. ....
%Vor%