2014-03-27 117 views
3

如果我將Set [Int](或List [Int])的未知數作爲輸入並且想要合併 我不知道我需要生成的輸入List [Int]的大小這些元組作爲最終結果,實現這個目標的最好方法是什麼?我的代碼如下所示。從集合創建對

+1

由於我的回答指的是你刪除的代碼,我會保留在那裏.. – Kigyo

回答

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)) 

我想你也可以概括這與其他收藏品相比清單的工作,但你不能輕易使用模式匹配這一點,你必須通過迭代工作。