我有以下列表:
List(a, b, c, d, e)
如何从上述列表中创建所有可能的组合?我期望得到类似于:
a
ab
abc
或者你可以使用subsets
方法。不过你需要先将列表转换为集合。
scala> List(1,2,3).toSet[Int].subsets.map(_.toList).toList
res9: List[List[Int]] = List(List(), List(1), List(2), List(3), List(1, 2), List(1, 3), List(2, 3), List(1, 2, 3))
def combine(in: List[Char]): Seq[String] =
for {
len <- 1 to in.length
combinations <- in combinations len
} yield combinations.mkString
List
上定义的 combinations(length)
方法,将返回一个有限长度的子列表迭代器,该迭代器是由组合原始列表元素的所有可能方式生成的。使用 for 推导式可以获得所有长度在 1 到整个原始列表长度之间的可能组合。<-
左侧分配的 combinations
就是这样一种可能的洗牌方式。 yield
将返回一个包含所有可能组合的列表。请查看文档。 - pagoda_5bdef powerset[A](s: Set[A]) = s.foldLeft(Set(Set.empty[A])) { case (ss, el) => ss ++ ss.map(_ + el) }
val xs = List( 'a', 'b' , 'c' , 'd' , 'e' )
(1 to xs.length flatMap (x => xs.combinations(x))) map ( x => x.mkString(""))