2016-09-27 114 views
2

我正在尋找等效於Scala中的subsequences函數。我在scala.collection.Seq找不到它,也許它是在別的地方定義的。但是哪裏?獲取所有子序列的列表

我認爲這個問題是衆所周知的。作爲例子,給定序列​​,所有子序列的列表是["","a","b","ab","c","ac","bc","abc"]

Scala中的一個快速和骯髒的執行情況如下:

(for {ys <- xs.inits.toList; zs <- ys.tails} yield zs).distinct 

但它會是不錯的使用已定義的東西,更高效。

+2

遠非一個答案,但這個特殊的例子有另一種解決方案:' 「ABC」 .toSet.subsets()地圖(_ mkString( 「」)。)。 toList'。 –

+0

這與Haskell沒有什麼關係,你應該刪除Haskell標籤。 –

回答

4

你可以使用combinations

(0 to xs.length).toIterator.flatMap(i => xs.combinations(i)) 
+1

請注意,這不會返回連續元素的子序列。上面的代碼將返回不同於期望的[[「」「,」a「,」b「,」ab「,」c「,」ac「)的'[a,b,c,ab,ac,bc] 「BC」, 「ABC」]'。 –

+0

把旁邊的一個推出去,現在應該是正確的。 – Reactormonk