初學者的問題。給定一個任意長度爲的列表,其中包含一個或多個字符(如List(「ab」,「def」,「t」))中的一個或多個字符,如何生成包含所有組合的列表?防爆。列表(「adt」,「aet」,「aft」,「bdt」,...)預先感謝。如何從字符串列表中生成字符串組合?
回答
一個簡單的遞歸方法看起來是這樣的:
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
}
要注意的是這種方法不是尾遞歸,所以它會溢出的長列表。
List("ab", "def", "t").foldLeft(List("")){ (acc, s) =>
for(prefix <- acc; c <- s) yield (prefix + c)
}
這被稱爲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
是一個有用的抽象知道。
當'F'和'G'都是'List'的時候,我很難直覺'序列'會做什麼。我想現在我已經閱讀了你的答案並思考它,我會記住它。 – huynhjl
剛開始使用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)
如果你冷靜下來,至少可以評論你爲什麼這樣做,因爲我寫過'我從scala開始......',並且期待這個答案不會成爲現實,至少我可能會學習如果你留下評論,請留言 – Kris
- 1. 從字符串列表中有效生成一組字符
- 2. 從C#中的字符串列表生成隨機字符串?
- 3. MATLAB從字符串生成組合
- 4. 生成列表字符串
- 5. 生成地圖[字符串,列表[字符串]從列表[(字符串,字符串)]
- 6. 從列表生成字符串
- 7. 如何從普通字符串中生成JSON字符串?
- 8. 從字符串中生成子串的組合
- 9. 如何從字符串集合中生成一個唯一的字符串?
- 10. 如何從Java中的字符串集合生成隨機字符串?
- 11. 從給定字符串生成一組字符串
- 12. 如何將字符串生成的子串存儲到字符串數組中?
- 13. 如何從該數組的字符串表示生成數組?
- 14. 如何生成JSON字符串數組?
- 15. 如何從字符串列表中的字符串搜索
- 16. 字符串和字符串生成器
- 17. resteasy,jaxb - 如何生成一個集合/字符串列表?
- 18. 生成excel表字符串
- 19. 如何生成oracle字符串序列?
- 20. 如何分隔字符串生成器中的字符串?
- 21. (字符串組合)從interviewstreet.com
- 22. 如何從字符串生成流?
- 23. CSHARP如何生成/從字符串
- 24. 如何檢查字符串((字符串和(字符串列表)))的列表中的字符串?
- 25. 生成所有可能的字符組合的字符串
- 26. 從字符串列表到字符串中的接口列表
- 27. 從長字符串生成序列號
- 28. 從字符串生成隨機序列
- 29. 生成字符串
- 30. 生成字符串
基本上,你正在尋找Seq [Seq [T]]的笛卡爾乘積,對嗎? –