2016-09-27 115 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