2017-09-22 55 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) 

這會得到相同的結果,但您不需要在理解之前轉換您的列表之一。