所有组合的清单

时间:2014-06-10 20:44:31

标签: list scala

我目前正在努力解决组合问题。作为初始输入,我有一个元组列表列表,换句话说如下:

List[List[(Char, Int)]]
List(List('k', 2), List('r', 2))

鉴于上面的输入,或者char和int的任意组合,我应该返回以下内容:

List(List(),List(('k', 1)),List(('k', 2)),List(('r', 1)),List(('k', 1), ('r', 1)),
     List(('k', 2), ('r', 1)), List(('r', 2)), List(('k', 1), ('r', 2)), 
     List(('k', 2), ('r', 2))
)

使用Scala's For我已将字符和整数分隔到列表中

List(List(), List(1), List(2), List(1, 2))
List(List(), List(k), List(r), List(k, r))

但我仍然坚持如何结合两个列表来获取上面所有子集的列表。我试过了

lettersets map (i => numsets flatMap (j => i zip j))

然而,这会返回以下不完整和不正确的结果:

List(
     List(), List((k,1), (k,2), (k,1)), List((r,1), (r,2), (r,1)), 
     List((k,1), (k,2), (r,1), (r,2))
    )

任何人都可以帮助我改进我的方法,或者告诉我为什么这不起作用并建议更好的方法,所以我可以得到剩余的组合。?(

List(('a', 1), ('b', 2))
List(('a', 2), ('b', 2))

P.S。输入列表不仅限于两个元素,它应该能够适用于原始列表的所有N个元素。最后,我真的不想要解决方案本身,只是尝试其他事情的建议或改进我的地图地图。

谢谢大家的帮助和提示。

2 个答案:

答案 0 :(得分:3)

我得到了答案谢谢@Poindextrose提示,它引导我找到正确的答案。这是我的解决方案

  def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match {
    case List() => List(Nil)
    case (c, n) :: others =>
       val tails = combinations(others)
       tails ::: (for {
            j <- tails
            i <- 1 to n
          } yield (c, i) :: j)

答案 1 :(得分:0)

(for {
  p <- input
  i <- 1 to p._2
} yield (p._1, i)).toSet.subsets.map(_.toList).toList
  .filter(l =>  l.map(_._1).toSet.size == l.size)

输入列表(列表(&#39; k&#39;,2),列表(&#39; r&#39;,2))