来自两个scala列表的非重复不同对组合

时间:2017-09-22 05:51:31

标签: performance scala list merge combinations

我有两个清单:

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)中的一个。对的顺序并不重要。如果两个输入列表很大,我该如何有效地计算输出。

提前致谢。

1 个答案:

答案 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。如果首选,可以使用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)

这会产生相同的结果,但您无需在理解之前转换其中一个列表。