Disons que nous avons deux listes Seq[A]
et Seq[B]
de certains objets et que nous voulons les joindre sous certaines conditions (A, B) => Boolean
. Cela pourrait être comme pour un élément de la première liste il y a plusieurs éléments correspondants du second. Si nous parlons de full join
, nous voulons aussi savoir pour quels éléments pour les deux listes il n'y a pas de paire correspondante.méthode de "jointure complète" pour les listes
Ainsi, la signature serait:
def fullJoin[A, B](left: Seq[A], right: Seq[B], joinCondition: (A, B) => Boolean): (Seq[A], Seq[B], Seq[(A, B)])
Ou si nous profitions de chats Type de Ior
:
def fullJoin[A, B](left: Seq[A], right: Seq[B], joinCondition: (A, B) => Boolean): Seq[Ior[A, B]]
L'exemple:
scala> fullJoin[Int, Int](List(1,2), List(3,4,4), {_ * 2 == _ })
res4: (Seq[Int], Seq[Int], Seq[(Int, Int)]) = (List(1),List(3),List((2,4), (2,4)))
L'idée est exactement la Identique à l'idée de joindre des tables en SQL.
La question est de savoir s'il existe des méthodes utilitaires similaires dans la bibliothèque standard. Si ce n'est pas le cas, discutons d'une solution élégante - dans un premier temps, avec des performances qui ne posent pas de problème (une complexité quadratique est bonne, comme pour Nested Loop).
Toute chance d'être plus restrictive de la rejoindre condition? Si cela peut être n'importe quelle fonction, alors je ne vois aucun espoir de faire mieux que la complexité quadratique, et votre réponse affichée semble bien. Mais si, par exemple, vous pouviez le réduire à une certaine égalité, cela ouvre des possibilités. Par exemple, exiger les fonctions 'f1: A => C',' f2: B => C' et joindre sur 'f1 (a) == f2 (b)'. –