我有两个清单:
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 :(得分:3)
如果最终订单根本不重要,那么您可以使用Set
,它会自动删除所有重复项。在这种情况下,确保所有元组中的值遵循相同的顺序是必要的。例如,确保元组中的值始终按照按顺序排列。工作示例:
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
。在for-comprehension之前,第一个列表将转换为Set
,这也将最终结果转换为Set
。如果首选,可以使用map
和filter
编写相同的逻辑。
或者,您可以使用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)
这会产生相同的结果,但您无需在理解之前转换其中一个列表。