So wählen Sie eindeutige Elemente aus

8

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:

%Vor%

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.

    
Konstantin 28.07.2014, 00:32
quelle

5 Antworten

8

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:

%Vor%

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 :

%Vor%

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%     
Cary Swoveland 28.07.2014, 06:33
quelle
3

Hier ist ein anderer Weg.

Code

%Vor%

Beispiele

%Vor%

Erläuterung

  • Wenn uniq_elements mit einem Block aufgerufen wird, wird es als proc prc .
  • empfangen
  • Wenn uniq_elements ohne einen Block aufgerufen wird, prc ist nil , so setzt die erste Anweisung der Methode prc auf den Standardwert proc (lambda).
  • Ein anfänglich leerer Hash, 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] .
  • Die Menge 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.
  • Die folgenden Schritte werden für jedes Element e des Arrays self ausgeführt:
    • k = prc[e] wird berechnet.
    • Wenn dups k enthält, e ein dup ist, muss nichts mehr getan werden; sonst
    • Wenn 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
    • Das Element k=>e wird zu uniques als Kandidat für ein eindeutiges Element hinzugefügt.
  • Die Werte von unique werden zurückgegeben.
Cary Swoveland 28.07.2014 03:57
quelle
1
%Vor%

Array # uniq findet keine nicht duplizierten Elemente, stattdessen entfernt Array # uniq Duplikate.

    
7stud 28.07.2014 02:51
quelle
0
%Vor%     
Boris Stitnicky 28.07.2014 03:22
quelle
0
  1. Das Erstellen und Aufrufen eines Standard-Procs ist Zeitverschwendung und
  2. Durch die Verwendung von gequälten Konstrukten alles in eine Zeile zu bringen, macht den Code nicht effizienter - es macht den Code nur schwerer verständlich.
  3. In require-Anweisungen verwenden Ruby-Namen keine Dateinamen.

....

%Vor%     
7stud 28.07.2014 17:45
quelle

Tags und Links