У меня есть две последовательности объектов, где объекты имеют общий атрибут (назовём его идентификатор)Zip редкие последовательности
case class ThingA(id: Int, someAttribute: String)
case class ThingB(id: Int, someOtherAttribute: Float)
Я хочу присоединиться к «разреженные» списков, который должен сказать, что каждый ThingA.id
мощь не соответствуют ThingB.id
и наоборот. Иды уникальны в каждом списке.
Пример ввода:
val thingAs = Seq(ThingA(0, "foo"), ThingA(1, "bar"))
val thingBs = Seq(ThingB(0, 1.0), ThingB(2, 0.3))
Желаемый результат:
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))
)
Моя текущая попытка выглядит следующим образом:
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
, который работает, но я надеюсь, что там это лучший способ.
Посмотрите в ' .groupBy'. Группируйте один раз по id, затем «сопоставьте» другой, чтобы присоединиться. – Dima
@ Дима, нет точки в '.groupBy'? «Иды уникальны в каждом списке». –
@ArchetypalPaul точка поиска в «Карте» постоянное время – Dima