Ich habe eine Ruby-Klasse
class MyClass
attr_writer :item1, :item2
end
my_array = get_array_of_my_class() #my_array is an array of MyClass
unique_array_of_item1 = []
Ich möchte drücken MyClass#item1
zu unique_array_of_item1
, aber nur , wenn unique_array_of_item1
nicht das enthält item1
noch. Es gibt eine einfache Lösung, die ich kenne: Durchlaufen Sie einfach my_array
und prüfen Sie, ob unique_array_of_item1
der aktuelle bereits vorhanden ist item1
oder nicht.
Gibt es eine effizientere Lösung?
Set#each
undSet#to_a
)@hash
. Und ab Ruby 1.9 werden Hashes bestellt. "Hashes zählen ihre Werte in der Reihenfolge auf, in der die entsprechenden Schlüssel eingefügt wurden." ruby-doc.org/core-1.9.1/Hash.html@Coorasse hat eine gute Antwort , obwohl es sein sollte:
Und um
my_array
an Ort und Stelle zu aktualisieren :quelle
my_array |= [item]
welche wirdmy_array
an Ort und Stelle aktualisiert|=
funktioniert in meinen Tests mit 2.1.1 einwandfrei . Bitte beschreiben Sie Ihren Testfall oder öffnen Sie eine neue Frage.Sie müssen nicht
my_array
von Hand durchlaufen .Bearbeiten:
Wie Tombart in seinem Kommentar betont, ist die Verwendung
Array#include?
nicht sehr effizient. Ich würde sagen, dass die Auswirkungen auf die Leistung bei kleinen Arrays vernachlässigbar sind, aber Sie sollten sichSet
für größere Arrays entscheiden .quelle
array.include?(item)
hat KomplexitätO(n)
- es ist also so, als würde man das gesamte Array iterieren. Schauen Sie sich diesen Benchmark an: gist.github.com/deric/4953652Sie können item1 in ein Array konvertieren und diese verbinden:
quelle
|
nicht sein||
(siehe Jasons Antwort)Es ist wichtig zu beachten, dass die Set-Klasse und die | Die Methode (auch "Set Union" genannt) liefert ein Array eindeutiger Elemente. Dies ist ideal, wenn Sie keine Duplikate möchten. Dies ist jedoch eine unangenehme Überraschung, wenn Sie nicht eindeutige Elemente in Ihrem ursprünglichen Array haben.
Wenn Sie mindestens ein doppeltes Element in Ihrem ursprünglichen Array haben, das Sie nicht verlieren möchten, ist das Durchlaufen des Arrays mit einer frühen Rückgabe O (n) im schlimmsten Fall, was im großen Schema der Dinge nicht allzu schlecht ist .
quelle
Ich bin mir nicht sicher, ob es die perfekte Lösung ist, habe aber für mich gearbeitet:
quelle