2017-09-22 30 views
1

非重复不同的对组合我有两个列表:从两个阶列表

val l1 = List(1,2,3) 

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

这两个列表结合,我如何获得以下结果?

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

注意(2,1)或(1,2)中只有一个被选中。配对顺序无关紧要。如果两个输入列表很大,我如何高效计算输出。

在此先感谢。

+0

添加了一些更详细的信息,希望它可以帮助你。考虑接受答案(通过点击复选标记),如果它有助于解决您的问题。 – Shaido

+0

谢谢@Shaido。 :)你的答案有帮助!回复较晚,抱歉。 – accssharma

回答

3

如果最终订单根本不重要,那么您可以使用Set,它将自动删除所有重复项。在这种情况下,确保所有元组中的值遵循相同的顺序是很危险的。例如,确保元组中的值始终以acsending顺序。工作示例:

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 

这会给你一个Set包含所请求的元组。第一个列表在理解之前转换为Set,这也使最终结果成为Set。如果这是首选,则可以用mapfilter来编写相同的逻辑。


或者,你可以使用breakOut(在回答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) 

这会得到相同的结果,但您不需要在理解之前转换您的列表之一。