【问题标题】:list of all combinations所有组合的列表
【发布时间】:2014-07-31 18:38:47
【问题描述】:

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

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 的 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))

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

感谢大家的帮助和提示。

【问题讨论】:

  • 在我看来构造幂集的算法对你很有用
  • 但是请注意 List(List('k', 2), List('r', 2)) 不是 List[List[(Char,Int)]] 它应该是 List (列表(('k',2)),列表(('r',2)))
  • 对不起各位忘了说输出的类型是:List[List[(Char, Int)]]
  • 这个问题与Functional Programming Principles in Scala,特别是def combinations中的第6周编程作业极为相似。唯一的区别是您将“a”和“b”替换为“k”和“r”(尽管您忘记了第二个代码块)。 :(

标签: list scala


【解决方案1】:

我得到了答案,谢谢@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)

【讨论】:

    【解决方案2】:
    (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)
    

    输入List(List('k', 2), List('r', 2))

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多