Ich bin gerade auf einen von Tony Morris ' Blog-Posts über Java gestoßen
Das klassische Problem manifestiert sich, wenn man etwa an einen Handel denkt. Nehmen wir an, ich mache zwei Trades von +100 Vodafone Shares @ 150p. Die beiden Berufe sind gleich, ja? Außer sie sind nicht der gleiche Handel . Im Falle eines normalen realen Systems, mit Persistenz oder Serialisierung, kann ich mich nicht auf Identität verlassen, um mir zu sagen, ob zwei Referenzen auf dasselbe Geschäft sind!
Ich möchte also eine Sammlung erstellen, zu der ich eine Gleichheitsbeziehung führen kann:
%Vor% Wie würde ich meinen Satz auf effiziente Weise implementieren (außer der EqualityRelation
definiert auch einen hash
-Mechanismus)?
Also sind die Fragen:
Es scheint, dass es mit implicits ziemlich einfach ist, dem existierenden scala Set
-Typ hinzuzufügen.
Dies kann bereits mit Java TreeSet und einer Comparator-Implementierung erreicht werden:
%Vor%Ausgabe:
%Vor% Dies hat die Nachteile, dass der zu implementierende Komparator leistungsfähiger ist als benötigt und dass Sie auf Sammlungen beschränkt sind, die Komparatoren unterstützen. Wie von oxbow_lakes gezeigt, bricht die Comparator-Implementierung den Set-Vertrag (für !a.equals(b)
könnte es das sein new Set(); set.add(a) == true && set.add(b) == false
).
Scala unterstützt dies mit einer Ansichtstransformation von A = & gt; Bestellte [A].
%Vor%Sie beschreiben das Konzept einer Hashing-Strategie. Die Fundbibliothek enthält Sets und Maps, die mit Hash-Strategien erstellt werden können.
Ich weiß, dass Sie nach Scala fragen, aber es lohnt sich, mit den Angeboten von .Net zu vergleichen. Insbesondere können alle Hash-basierten Sammlungen (zB Dictionary<TKey, TValue>
und HashSet<T>
) eine Instanz von IEqualityComparer<T>
. Dies ist vergleichbar mit Scalas Equiv[T]
, liefert aber auch einen benutzerdefinierten Hash-Code . Sie könnten ein ähnliches Merkmal erstellen, indem Sie Equiv
:
Um vollständig unterstützt zu werden, müssten Hash-basierte Sammlungen HashEquiv
implizite Parameter zu ihrer Konstruktion hinzufügen und die implizit importierten equiv
und hashOf
Methoden anstelle der Object
Instanzmethoden verwenden (wie TreeSet
, usw. mit dem Merkmal Ordered
, aber umgekehrt. Es müsste auch eine implizite Konvertierung von Any
nach HashEquiv
erfolgen, die die intrinsische Implementierung equals
und hashCode
verwendet.
Tags und Links scala equality equals scala-2.8 scala-collections