2017-09-22 2 views
1

j'ai deux listes:distinctes combinaisons de paires non-répétition de deux listes de scala

val l1 = List(1,2,3) 

val l2 = List(1,2,4,5) 

La combinaison de ces deux listes, comment puis-je obtenir le résultat suivant?

List((1,1), (1,2), (1,4), (1,5), (2,2), (2,4), (2,5), (3,1), (3,2), (3,4), (3,5)) 

Notez comment un seul de (2,1) ou (1,2) est choisi. L'ordre des paires n'a pas d'importance. Comment puis-je calculer la sortie efficacement étant donné que les deux listes d'entrée sont grandes.

Merci d'avance.

+0

Ajout d'informations plus détaillées, espérons que cela peut vous aider. Envisagez d'accepter la réponse (en cliquant sur la coche) si cela vous a aidé à résoudre votre problème. – Shaido

+0

Merci @Shaido. :) Votre réponse a aidé! Désolé pour la réponse tardive. – accssharma

Répondre

3

Si l'ordre final n'a aucune importance, vous pouvez utiliser un Set qui supprimera automatiquement tous les doublons. Dans ce cas, il est nécessaire de s'assurer que les valeurs de tous les tuples suivent le même ordre. Par exemple, assurez-vous que les valeurs dans les tuples sont toujours dans l'ordre alphabétique. Exemple de travail:

val l1 = List(1,2,3).toSet // Convert one of the lists to a Set 
val l2 = List(1,2,4,5) 

val set = for { 
    x <- l1 
    y <- l2 
    z = if (x<y) (x,y) else (y,x) 
} yield z 

Cela vous donnera un Set contenant les tuples demandés. La première liste est convertie en Set avant la compréhension for, le résultat final devient également Set. La même logique peut être écrite avec map et filter à la place si cela est préférable.


Vous pouvez également utiliser breakOut (très bien expliqué dans la réponse here).

import scala.collection.breakOut 
val set: Set[(Int, Int)] = 
    (for { 
    x <- l1 
    y <- l2 
    z = if (x<y) (x,y) else (y,x) 
    } yield z) (breakOut) 

Ceci donnera les mêmes résultats, mais vous n'avez pas besoin de convertir une de vos listes avant la compréhension.