初学者问题。给定任意长度的列表,其中包含字符串中的一个或多个字符,例如List(“ab”,“def”,“t”),如何生成包含所有组合的列表?防爆。列表(“adt”,“aet”,“aft”,“bdt”,...)先谢谢。
答案 0 :(得分:1)
一个简单的递归方法可能如下所示:
def foo(xs: List[String], current: String = ""): List[String] = xs match {
case head :: Nil =>
head map { c =>
current + c
} toList
case head :: tail =>
head flatMap { c =>
foo(tail, current+c)
} toList
case _ => Nil
}
请注意,此方法不是尾递归的,因此对于长列表会溢出。
答案 1 :(得分:1)
List("ab", "def", "t").foldLeft(List("")){ (acc, s) =>
for(prefix <- acc; c <- s) yield (prefix + c)
}
答案 2 :(得分:1)
这是一项名为sequence
的操作,通常会将F[G[A]]
转换为G[F[A]]
(您需要了解有关F
和G
的某些事项 - 有关详细信息,请参阅this answer或this blog post。
例如,使用Scalaz,您可以写下:
import scalaz._, Scalaz._
List("ab", "def", "t").map(_.toList).sequence.map(_.mkString)
或等效地:
List("ab", "def", "t").traverse(_.toList).map(_.mkString)
按照预期,您将获得以下内容:
List(adt, aet, aft, bdt, bet, bft)
这比使用foldLeft
的标准库版本简洁得多,但sequence
是一个有用的抽象知识。
答案 3 :(得分:-1)
我自己从Scala开始,但您可以使用'子集'方法为您完成大部分工作:
val lst = List("ab", "def", "t")
val re = (for(l <- lst) yield (l.toCharArray)).flatten.toSet.subsets.toList
val res = for(r <- re) yield (r.mkString)
给你:
res: List[String] = List("", e, t, f, a, b, d, et, ef, ea, eb, ed, tf, ta, tb, t
d, fa, fb, fd, ab, ad, bd, etf, eta, etb, etd, efa, efb, efd, eab, ead, ebd, t
fa, tfb, tfd, tab, tad, tbd, fab, fad, fbd, abd, etfa, etfb, etfd, etab, etad,
etbd, efab, efad, efbd, eabd, tfab, tfad, tfbd, tabd, fabd, etfab, etfad, etf
bd, etabd, efabd, tfabd, etfabd)