Eine Möglichkeit ist, Ihre eigene Set
von Artikel zu bauen , Verpackung sowohl ein SortedMap[Int, Set[Item]]
(zur Bestellung) und eine HashSet[Item]
(für Zugriffsleistung:
class MyOrderedSet(items: Set[Item], byPrice: collection.SortedMap[Int, Set[Item]]) extends Set[Item] {
def contains(key: Item) = items contains key
def iterator = byPrice map {_._2.iterator} reduceOption {_ ++ _} getOrElse Iterator.empty
def +(elem: Item) =
new MyOrderedSet(items + elem, byPrice + (elem.score -> (byPrice.getOrElse(elem.score, Set.empty) + elem)))
def -(elem: Item) =
new MyOrderedSet(items - elem, byPrice + (elem.score -> (byPrice.getOrElse(elem.score, Set.empty) - elem)))
// override any other methods for your convenience
}
object MyOrderedSet {
def empty = new MyOrderedSet(Set.empty, collection.SortedMap.empty)
// add any other factory method
}
Modi fizierung des Satzes ist schmerzhaft, weil Sie zwei Sammlungen synchronisiert, aber alle Funktionen, die Sie wollen, gibt es (zumindest hoffe ich)
Ein kurzes Beispiel:
scala> MyOrderedSet.empty + Item("a", 50) + Item("b", 20) + Item("c", 100)
res44: MyOrderedSet = Set(Item(b,20), Item(a,50), Item(c,100))
Es gibt auch einen kleinen Nachteil, die tatsächlich ist nicht auf die vorgeschlagene Struktur verbunden: Sie können überprüfen, ob ein Element in dem Satz ist, aber man kann nicht seinen Wert erhalten:
scala> res44 contains Item("a", 100)
res45: Boolean = true
Nichts in der API Sie Item("a", 50)
als Ergebnis erhalten können. Wenn Sie dies möchten, schlage ich vor, Map[String, Item]
anstelle von Set[Item]
für items
(und natürlich, um den Code entsprechend zu ändern).
EDIT: Für die Neugierigen, hier ist die Quicky schriftliche Fassung von Artikel Ich verwende:
case class Item(id: String, score: Int) {
override def equals(y: Any) =
y != null && {
PartialFunction.cond(y) {
case Item(`id`, _) => true
}
}
}
ich am Ende mit etwas wie: SortedSet für sortierte Darstellung + Karte (id -> Artikel) für Mitgliedschaft/Gleichheit. So kann ich zuerst herausfinden, welche Elemente neu in einer "Sammlung" sind und dann neue Elemente hinzufügen und zuordnen. Auf diese Weise habe ich Sicht und strenge Gleichheit sortiert. Aber es sieht nicht so gut aus :( – tuxSlayer
Ich kann nicht nur Set für die Mitgliedschaft verwenden, da es keine Möglichkeit gibt, Entity aus der Menge zu bekommen, ich kann nur contains() true von false haben. – tuxSlayer
Wie gehen Sie mit dem Fall um Sie fügen ein Element hinzu, das bereits im Set ist, aber mit einer anderen Punktzahl? – Nicolas