【发布时间】:2012-10-18 01:33:00
【问题描述】:
我有以下清单:
List(a, b, c, d, e)
如何从上面的列表中创建所有可能的组合?
我希望是这样的:
a
ab
abc
【问题讨论】:
-
类似,但集合除外:stackoverflow.com/q/11581175/770361
我有以下清单:
List(a, b, c, d, e)
如何从上面的列表中创建所有可能的组合?
我希望是这样的:
a
ab
abc
【问题讨论】:
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 为您提供所有可能组合的列表。检查the docs
或者您可以使用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))
【讨论】:
val xs = List( 'a', 'b' , 'c' , 'd' , 'e' )
(1 to xs.length flatMap (x => xs.combinations(x))) map ( x => x.mkString(""))
这应该为您提供由空字符串连接的所有组合。
【讨论】:
def powerset[A](s: Set[A]) = s.foldLeft(Set(Set.empty[A])) { case (ss, el) => ss ++ ss.map(_ + el) }
听起来你需要Power set。
【讨论】: