Ich suche nach einer schönen Möglichkeit, die Elemente von zwei Scala Kollektionen zu vergleichen und eine dritte Kollektion basierend auf einer Bedingung zu erstellen. Ich kann das Code-Erscheinungsbild für die Leistung opfern.Vergleichen Sie alle Elemente zweier Sammlungen und produzieren Sie eine dritte
Unter der Annahme, die folgenden:
case class Item(name: String, category: String, code: String, price: Int, freeItem: Option[Item])
val parentItems = Seq(
Item("name_1", "category_A", "code_A", 100, None),
Item("name_2", "category_B", "code_B", 100, None),
Item("name_3", "category_C", "code_C", 100, None)
)
val childItems = Seq(
Item("name_4", "category_A", "code_A", 100, None),
Item("name_5", "category_C", "code_C", 100, None)
)
def isChild(i1: Item, i2: Item): Boolean = {
i1.name != i2.name &&
i1.category == i2.category &&
i1.code == i2.code
}
val parentsWithChildren: Seq[Item] = (
for {
i1 <- parentItems;
i2 <- childItems
} yield {
if (isChild(i1, i2)) Some(i1.copy(freeItem = Some(i2.copy())))
else None
}).filter(_.isInstanceOf[Some[_]]).map(_.get)
Die obige Snippet wird das folgende Ergebnis produzieren, die die excpected ist:
Seq(
Item("name_1", "category_A", "code_A", 100,
Some(Item("name_4", "category_A", "company_A", 100, None))),
Item("name_3", "category_C", "code_C", 100,
Some(Item("name_5", "category_C", "company_C", 100, None)))
)
Ich weiß, dass der obige Code Lücken hat, aber das ist in Ordnung. Was ich suche ist:
Gibt es eine Weise, die ich vermeiden können, wenn (IsChild (i1, i2))
Some(i1.copy(freeItem = Some(i2.copy()))) else None
und als Folge der.filter(_.isInstanceOf[Some[_]]).map(_.get)
? Wäre Teilfunktion eine Option?Ich verwende hier eine verschachtelte Schleife, ich würde so etwas in Java tun. Gibt es eine andere Möglichkeit, sich ihr zu nähern? Ich dachte ich
zip
zuerst, aber offensichtlich funktioniert nicht, zumindest für sich allein.
Vielen Dank im Voraus!
Danke, dass Sie sich die Zeit genommen haben, die Frage zu beantworten. "flatten" arbeiten gut und erzeugen das erwartete Ergebnis. @Martin hat es jedoch noch kompakter gemacht. Ich denke, dass beide Implementierungen mehr oder weniger das gleiche leisten sollten. – Angelos
@Angelos Ja, seine Lösung ist besser, besser lesbar – nmat