从集合中创建对

时间:2014-03-27 17:14:14

标签: scala

如果我将未知数量的Set [Int](或List [Int])作为输入并想要组合 我不知道输入List [Int]的大小我需要将这些元组作为最终结果生成,实现这一目标的最佳方法是什么?我的代码如下所示。

1 个答案:

答案 0 :(得分:3)

确定。由于combine(xs)会生成List[List[Any]]而您有a :: combine(xs),因此您只需将a插入所有组合的列表中。您希望将a与可能组合的每个元素组合在一起。这引出了我的解决方案。

您还可以将其概括为lists:List[List[T]],因为当您从lists:List[List[Int]]合并时,您将获得List[List[Int]]

def combine[T](lists: List[List[T]]): List[List[T]] = lists match {
  case Nil => lists
  case x :: Nil => for(a <- x) yield List(a) //needed extra case because if comb(xs) is Nil in the for loop, it won't yield anything
  case x :: xs => {
    val comb = combine(xs) //since all further combinations are constant, you should keep it in a val
    for{
      a <- x
      b <- comb
    } yield a :: b
  }
}

试验:

val first = List(7, 3, 1)
val second = List(2, 8)
val third = List("a","b")

combine(List(first, second)) 
//yields List(List(7, 2), List(7, 8), List(3, 2), List(3, 8), List(1, 2), List(1, 8))
combine(List(first, second, third))
//yields List(List(7, 2, a), List(7, 2, b), List(7, 8, a), List(7, 8, b), List(3, 2, a), List(3, 2, b), List(3, 8, a), List(3, 8, b), List(1, 2, a), List(1, 2, b), List(1, 8, a), List(1, 8, b))

我认为你也可以将其概括为与List之外的其他集合一起使用,但是你不能轻易地使用模式匹配,你必须通过迭代器工作。