Ich habe zwei Sequenzen von Objekten, wo die Objekte ein gemeinsames Attribut teilen (können id nennen es)Zip spärliche Sequenzen
case class ThingA(id: Int, someAttribute: String)
case class ThingB(id: Int, someOtherAttribute: Float)
ich will „spärlich“ Listen verbinden, die, dass jeder ThingA.id
Macht sagen, nicht übereinstimmen mit ThingB.id
und umgekehrt. Die IDs sind in jeder Liste eindeutig.
Beispiel Eingabe:
val thingAs = Seq(ThingA(0, "foo"), ThingA(1, "bar"))
val thingBs = Seq(ThingB(0, 1.0), ThingB(2, 0.3))
gewünschte Ausgabe:
val zipped: Seq(Tuple[Option[ThingA], Option[ThingB]]) = Seq(
(Some(ThingA(0, "foo")), Some(ThingB(0, 1.0))), // Matching id = 0
(Some(ThingA(1, "bar")), None),
(None, Some(ThingB(2, 0.3))
)
wie Meine aktuelle Versuch aussieht:
val zipped = (
thingAs.map(a => (Some(a), thingBs.find(b => b.id == a.id))) ++
thingBs.map(b => (thingAs.find(a => a.id == b.id), Some(b)))
).distinct
, die funktioniert, aber ich bin der Hoffnung, dass es ist ein besserer Weg.
Blick ' .groupBy'. Gruppiere eins nacheinander mit "id", dann "map" das andere, um mitzumachen. – Dima
@Dima, kein Punkt in der '.groupBy'? "Die IDs sind in jeder Liste eindeutig." –
@ArchetypalPaul der Punkt ist Nachschlagen in einer 'Map' sind konstante Zeit – Dima