【问题标题】:Scala: How to split a list into tuples in all possible waysScala:如何以所有可能的方式将列表拆分为元组
【发布时间】:2018-11-04 17:12:37
【问题描述】:

我们有一个存放每个产品的地方。每个订单都包含一组产品。仓储工人有一辆手推车,可以容纳 N 个订单。 对于订单列表,请找到解决该列表的所有可能解决方案。

(我正在寻找一种算法,可以创建将列表拆分为元组的所有可能性,其中元组或元素的顺序无关紧要。)

这里是一个手推车最多 2 个订单 (N=2) 的示例。

val orders = List(1,2,3,4)
findAllSolutions(orders, 2)
List(
    Solution(Trolley(1,2),Trolley(3,4)), 
    Solution(Trolley(1,3),Trolley(2,4)), 
    Solution(Trolley(1,4),Trolley(2,3))
)

我可以试试

def tuplelize(lst: List[Int], tplLen) = List(1,2,3,4).permutations.map(l => l.grouped(tplLen).toList)

但这会多次产生相同的结果。例如

List((1,2),(3,4))

List((2,1),(4,3))

是一样的。

一种可能性是:

List(1,2,3,4).combinations(2).combinations(2).filter(_.flatten.toSet.size == 4)

但这似乎效率很低... 另一个澄清事情的例子: 给定的是一个列表(1,2,3,4,5),我想将它拆分为最大长度为 3 的子列表。以最少的子列表数量给出所有可能的解决方案,以便可以找到每个元素解决方案中只有一次

Solution1: List(List(1,2,3),List(4,5))
Solution2: List(List(1,2,4),List(3,5))
Solution2: List(List(1,2,5),List(3,4))
...

现在一个不需要的解决方案是:

DoubleSolution: List(List(3,2,1),List(5,4))

【问题讨论】:

  • 我不明白 tplLen 到底应该是什么。你能举另一个例子,不是所有的东西都是2x2x2x2吗?您的 tuplelize 似乎没有返回可迭代的元组列表,它返回可迭代的列表列表。您确定不想将其重命名为“listlilize”吗? ;)
  • List(List(1,2), List(3,4))List(List(3,4), List(1,2)) 这样的东西也是不需要的,因为被认为是重复的?
  • 是的,你明白了......所以我的“解决方案”结合了两个 combinations 调用将不起作用。
  • 我认为是tplLen 不必除lst 的大小这使得它非常讨厌......

标签: algorithm scala list tuples combinations


【解决方案1】:

枚举具有最少子集数的分区,使得除了最多一个子集之外的所有子集的大小最多为M

以下代码执行以下操作:

给定一个不同元素的列表和一些大小M,它会枚举List[List[Int]] 类型的所有分区,这样:

  • 分区的每个子集(以List[Int] 表示)最多包含M 元素
  • 子集的数量最少
  • 最多有一个子集少于M 个元素

也就是说,(几乎)所有子集的大小都为M,最多有一个例外。然后异常的大小为N % M,其中N 是原始列表中的元素数。


解决方案

事实证明这并不完全是微不足道的。尤其是子集的大小不必除以元素的数量这一事实令人讨厌,因为它以另一种方式破坏了对称性。

这是一个由三个阶段组成的解决方案:

  1. 解决分区大小除以列表大小的问题(sameSizePartitions)
  2. 解决生成任意规定大小的分区的更普遍问题 (prescribedSizePartition)
  3. 预先添加一个瘦包装器 maxSizePartitions,它计算规定的大小并调用 prescribedSizePartition

所以,就是:先泛化,解决不同的特殊情况,用不同的特殊情况解决一般情况,用一般情况实现想要的功能。

这是它的样子:

type Partition = List[List[Int]]

def sameSizePartitions(elems: List[Int], partSize: Int): List[Partition] = {
  def recHelper(unused: List[Int]): List[Partition] = {
    if (unused.size <= partSize) {
      List(List(unused))
    } else {
      val h :: t = unused
      (for {
        combination <- t.combinations(partSize - 1)
        tail <- recHelper(t filterNot combination.contains)
      } yield (h :: combination) :: tail).toList
    }
  }
  recHelper(elems)
}

/**
 * @param elems list with unique elements
 * @param sizes map (size -> numberOfPartitionsWithThisSize)
 */
def prescribedSizePartitions(elems: List[Int], sizes: Map[Int, Int]): List[Partition] = {
  if (sizes.isEmpty) {
    if (elems.isEmpty) List(Nil) 
    else throw new IllegalArgumentException("sizes empty, but elems = " + elems)
  } else {
    val (size, numberOfPartitions) = sizes.head
    val numElementsNeededForPartitionsOfThisSize = size * numberOfPartitions
    for {
      elemSelection <- elems.combinations(numElementsNeededForPartitionsOfThisSize).toList
      tailPartition <- prescribedSizePartitions(elems.filterNot(elemSelection.contains), sizes - size)
      currSizePart <- sameSizePartitions(elemSelection, size)
    } yield currSizePart ++ tailPartition
  }
}

def maxSizePartitions(elems: List[Int], maxSize: Int): List[Partition] = {
  val n = elems.size
  val ofMaxSize = n / maxSize
  val restSize = n % maxSize
  if (restSize == 0) {
    sameSizePartitions(elems, maxSize)
  } else {
    prescribedSizePartitions(elems, Map(maxSize -> ofMaxSize, restSize -> 1))
  }
}

例子:

maxSizePartitions((1 to 4).toList, 2) foreach println
maxSizePartitions((1 to 5).toList, 3) foreach println
maxSizePartitions((1 to 8).toList, 3) foreach println

输出:

List(List(1, 2), List(3, 4))
List(List(1, 3), List(2, 4))
List(List(1, 4), List(2, 3))

List(List(1, 2, 3), List(4, 5))
List(List(1, 2, 4), List(3, 5))
List(List(1, 2, 5), List(3, 4))
List(List(1, 3, 4), List(2, 5))
List(List(1, 3, 5), List(2, 4))
List(List(1, 4, 5), List(2, 3))
List(List(2, 3, 4), List(1, 5))
List(List(2, 3, 5), List(1, 4))
List(List(2, 4, 5), List(1, 3))
List(List(3, 4, 5), List(1, 2))

List(List(1, 2, 3), List(4, 5, 6), List(7, 8))
List(List(1, 2, 4), List(3, 5, 6), List(7, 8))
List(List(1, 2, 5), List(3, 4, 6), List(7, 8))
List(List(1, 2, 6), List(3, 4, 5), List(7, 8))
List(List(1, 3, 4), List(2, 5, 6), List(7, 8))
List(List(1, 3, 5), List(2, 4, 6), List(7, 8))
List(List(1, 3, 6), List(2, 4, 5), List(7, 8))
List(List(1, 4, 5), List(2, 3, 6), List(7, 8))
List(List(1, 4, 6), List(2, 3, 5), List(7, 8))
List(List(1, 5, 6), List(2, 3, 4), List(7, 8))
List(List(1, 2, 3), List(4, 5, 7), List(6, 8))
List(List(1, 2, 4), List(3, 5, 7), List(6, 8))
List(List(1, 2, 5), List(3, 4, 7), List(6, 8))
List(List(1, 2, 7), List(3, 4, 5), List(6, 8))
List(List(1, 3, 4), List(2, 5, 7), List(6, 8))
List(List(1, 3, 5), List(2, 4, 7), List(6, 8))
List(List(1, 3, 7), List(2, 4, 5), List(6, 8))
List(List(1, 4, 5), List(2, 3, 7), List(6, 8))
List(List(1, 4, 7), List(2, 3, 5), List(6, 8))
List(List(1, 5, 7), List(2, 3, 4), List(6, 8))
List(List(1, 2, 3), List(4, 5, 8), List(6, 7))
List(List(1, 2, 4), List(3, 5, 8), List(6, 7))
List(List(1, 2, 5), List(3, 4, 8), List(6, 7))
List(List(1, 2, 8), List(3, 4, 5), List(6, 7))
List(List(1, 3, 4), List(2, 5, 8), List(6, 7))
List(List(1, 3, 5), List(2, 4, 8), List(6, 7))
List(List(1, 3, 8), List(2, 4, 5), List(6, 7))
List(List(1, 4, 5), List(2, 3, 8), List(6, 7))
List(List(1, 4, 8), List(2, 3, 5), List(6, 7))
List(List(1, 5, 8), List(2, 3, 4), List(6, 7))
List(List(1, 2, 3), List(4, 6, 7), List(5, 8))
List(List(1, 2, 4), List(3, 6, 7), List(5, 8))
List(List(1, 2, 6), List(3, 4, 7), List(5, 8))
List(List(1, 2, 7), List(3, 4, 6), List(5, 8))
List(List(1, 3, 4), List(2, 6, 7), List(5, 8))
List(List(1, 3, 6), List(2, 4, 7), List(5, 8))
List(List(1, 3, 7), List(2, 4, 6), List(5, 8))
List(List(1, 4, 6), List(2, 3, 7), List(5, 8))
List(List(1, 4, 7), List(2, 3, 6), List(5, 8))
List(List(1, 6, 7), List(2, 3, 4), List(5, 8))
List(List(1, 2, 3), List(4, 6, 8), List(5, 7))
List(List(1, 2, 4), List(3, 6, 8), List(5, 7))
List(List(1, 2, 6), List(3, 4, 8), List(5, 7))
List(List(1, 2, 8), List(3, 4, 6), List(5, 7))
List(List(1, 3, 4), List(2, 6, 8), List(5, 7))
List(List(1, 3, 6), List(2, 4, 8), List(5, 7))
List(List(1, 3, 8), List(2, 4, 6), List(5, 7))
List(List(1, 4, 6), List(2, 3, 8), List(5, 7))
List(List(1, 4, 8), List(2, 3, 6), List(5, 7))
List(List(1, 6, 8), List(2, 3, 4), List(5, 7))
List(List(1, 2, 3), List(4, 7, 8), List(5, 6))
List(List(1, 2, 4), List(3, 7, 8), List(5, 6))
List(List(1, 2, 7), List(3, 4, 8), List(5, 6))
List(List(1, 2, 8), List(3, 4, 7), List(5, 6))
List(List(1, 3, 4), List(2, 7, 8), List(5, 6))
List(List(1, 3, 7), List(2, 4, 8), List(5, 6))
List(List(1, 3, 8), List(2, 4, 7), List(5, 6))
List(List(1, 4, 7), List(2, 3, 8), List(5, 6))
List(List(1, 4, 8), List(2, 3, 7), List(5, 6))
List(List(1, 7, 8), List(2, 3, 4), List(5, 6))
List(List(1, 2, 3), List(5, 6, 7), List(4, 8))
List(List(1, 2, 5), List(3, 6, 7), List(4, 8))
List(List(1, 2, 6), List(3, 5, 7), List(4, 8))
List(List(1, 2, 7), List(3, 5, 6), List(4, 8))
List(List(1, 3, 5), List(2, 6, 7), List(4, 8))
List(List(1, 3, 6), List(2, 5, 7), List(4, 8))
List(List(1, 3, 7), List(2, 5, 6), List(4, 8))
List(List(1, 5, 6), List(2, 3, 7), List(4, 8))
List(List(1, 5, 7), List(2, 3, 6), List(4, 8))
List(List(1, 6, 7), List(2, 3, 5), List(4, 8))
List(List(1, 2, 3), List(5, 6, 8), List(4, 7))
List(List(1, 2, 5), List(3, 6, 8), List(4, 7))
List(List(1, 2, 6), List(3, 5, 8), List(4, 7))
List(List(1, 2, 8), List(3, 5, 6), List(4, 7))
List(List(1, 3, 5), List(2, 6, 8), List(4, 7))
List(List(1, 3, 6), List(2, 5, 8), List(4, 7))
List(List(1, 3, 8), List(2, 5, 6), List(4, 7))
List(List(1, 5, 6), List(2, 3, 8), List(4, 7))
List(List(1, 5, 8), List(2, 3, 6), List(4, 7))
List(List(1, 6, 8), List(2, 3, 5), List(4, 7))
List(List(1, 2, 3), List(5, 7, 8), List(4, 6))
List(List(1, 2, 5), List(3, 7, 8), List(4, 6))
List(List(1, 2, 7), List(3, 5, 8), List(4, 6))
List(List(1, 2, 8), List(3, 5, 7), List(4, 6))
List(List(1, 3, 5), List(2, 7, 8), List(4, 6))
List(List(1, 3, 7), List(2, 5, 8), List(4, 6))
List(List(1, 3, 8), List(2, 5, 7), List(4, 6))
List(List(1, 5, 7), List(2, 3, 8), List(4, 6))
List(List(1, 5, 8), List(2, 3, 7), List(4, 6))
List(List(1, 7, 8), List(2, 3, 5), List(4, 6))
List(List(1, 2, 3), List(6, 7, 8), List(4, 5))
List(List(1, 2, 6), List(3, 7, 8), List(4, 5))
List(List(1, 2, 7), List(3, 6, 8), List(4, 5))
List(List(1, 2, 8), List(3, 6, 7), List(4, 5))
List(List(1, 3, 6), List(2, 7, 8), List(4, 5))
List(List(1, 3, 7), List(2, 6, 8), List(4, 5))
List(List(1, 3, 8), List(2, 6, 7), List(4, 5))
List(List(1, 6, 7), List(2, 3, 8), List(4, 5))
List(List(1, 6, 8), List(2, 3, 7), List(4, 5))
List(List(1, 7, 8), List(2, 3, 6), List(4, 5))
List(List(1, 2, 4), List(5, 6, 7), List(3, 8))
List(List(1, 2, 5), List(4, 6, 7), List(3, 8))
List(List(1, 2, 6), List(4, 5, 7), List(3, 8))
List(List(1, 2, 7), List(4, 5, 6), List(3, 8))
List(List(1, 4, 5), List(2, 6, 7), List(3, 8))
List(List(1, 4, 6), List(2, 5, 7), List(3, 8))
List(List(1, 4, 7), List(2, 5, 6), List(3, 8))
List(List(1, 5, 6), List(2, 4, 7), List(3, 8))
List(List(1, 5, 7), List(2, 4, 6), List(3, 8))
List(List(1, 6, 7), List(2, 4, 5), List(3, 8))
List(List(1, 2, 4), List(5, 6, 8), List(3, 7))
List(List(1, 2, 5), List(4, 6, 8), List(3, 7))
List(List(1, 2, 6), List(4, 5, 8), List(3, 7))
List(List(1, 2, 8), List(4, 5, 6), List(3, 7))
List(List(1, 4, 5), List(2, 6, 8), List(3, 7))
List(List(1, 4, 6), List(2, 5, 8), List(3, 7))
List(List(1, 4, 8), List(2, 5, 6), List(3, 7))
List(List(1, 5, 6), List(2, 4, 8), List(3, 7))
List(List(1, 5, 8), List(2, 4, 6), List(3, 7))
List(List(1, 6, 8), List(2, 4, 5), List(3, 7))
List(List(1, 2, 4), List(5, 7, 8), List(3, 6))
List(List(1, 2, 5), List(4, 7, 8), List(3, 6))
List(List(1, 2, 7), List(4, 5, 8), List(3, 6))
List(List(1, 2, 8), List(4, 5, 7), List(3, 6))
List(List(1, 4, 5), List(2, 7, 8), List(3, 6))
List(List(1, 4, 7), List(2, 5, 8), List(3, 6))
List(List(1, 4, 8), List(2, 5, 7), List(3, 6))
List(List(1, 5, 7), List(2, 4, 8), List(3, 6))
List(List(1, 5, 8), List(2, 4, 7), List(3, 6))
List(List(1, 7, 8), List(2, 4, 5), List(3, 6))
List(List(1, 2, 4), List(6, 7, 8), List(3, 5))
List(List(1, 2, 6), List(4, 7, 8), List(3, 5))
List(List(1, 2, 7), List(4, 6, 8), List(3, 5))
List(List(1, 2, 8), List(4, 6, 7), List(3, 5))
List(List(1, 4, 6), List(2, 7, 8), List(3, 5))
List(List(1, 4, 7), List(2, 6, 8), List(3, 5))
List(List(1, 4, 8), List(2, 6, 7), List(3, 5))
List(List(1, 6, 7), List(2, 4, 8), List(3, 5))
List(List(1, 6, 8), List(2, 4, 7), List(3, 5))
List(List(1, 7, 8), List(2, 4, 6), List(3, 5))
List(List(1, 2, 5), List(6, 7, 8), List(3, 4))
List(List(1, 2, 6), List(5, 7, 8), List(3, 4))
List(List(1, 2, 7), List(5, 6, 8), List(3, 4))
List(List(1, 2, 8), List(5, 6, 7), List(3, 4))
List(List(1, 5, 6), List(2, 7, 8), List(3, 4))
List(List(1, 5, 7), List(2, 6, 8), List(3, 4))
List(List(1, 5, 8), List(2, 6, 7), List(3, 4))
List(List(1, 6, 7), List(2, 5, 8), List(3, 4))
List(List(1, 6, 8), List(2, 5, 7), List(3, 4))
List(List(1, 7, 8), List(2, 5, 6), List(3, 4))
List(List(1, 3, 4), List(5, 6, 7), List(2, 8))
List(List(1, 3, 5), List(4, 6, 7), List(2, 8))
List(List(1, 3, 6), List(4, 5, 7), List(2, 8))
List(List(1, 3, 7), List(4, 5, 6), List(2, 8))
List(List(1, 4, 5), List(3, 6, 7), List(2, 8))
List(List(1, 4, 6), List(3, 5, 7), List(2, 8))
List(List(1, 4, 7), List(3, 5, 6), List(2, 8))
List(List(1, 5, 6), List(3, 4, 7), List(2, 8))
List(List(1, 5, 7), List(3, 4, 6), List(2, 8))
List(List(1, 6, 7), List(3, 4, 5), List(2, 8))
List(List(1, 3, 4), List(5, 6, 8), List(2, 7))
List(List(1, 3, 5), List(4, 6, 8), List(2, 7))
List(List(1, 3, 6), List(4, 5, 8), List(2, 7))
List(List(1, 3, 8), List(4, 5, 6), List(2, 7))
List(List(1, 4, 5), List(3, 6, 8), List(2, 7))
List(List(1, 4, 6), List(3, 5, 8), List(2, 7))
List(List(1, 4, 8), List(3, 5, 6), List(2, 7))
List(List(1, 5, 6), List(3, 4, 8), List(2, 7))
List(List(1, 5, 8), List(3, 4, 6), List(2, 7))
List(List(1, 6, 8), List(3, 4, 5), List(2, 7))
List(List(1, 3, 4), List(5, 7, 8), List(2, 6))
List(List(1, 3, 5), List(4, 7, 8), List(2, 6))
List(List(1, 3, 7), List(4, 5, 8), List(2, 6))
List(List(1, 3, 8), List(4, 5, 7), List(2, 6))
List(List(1, 4, 5), List(3, 7, 8), List(2, 6))
List(List(1, 4, 7), List(3, 5, 8), List(2, 6))
List(List(1, 4, 8), List(3, 5, 7), List(2, 6))
List(List(1, 5, 7), List(3, 4, 8), List(2, 6))
List(List(1, 5, 8), List(3, 4, 7), List(2, 6))
List(List(1, 7, 8), List(3, 4, 5), List(2, 6))
List(List(1, 3, 4), List(6, 7, 8), List(2, 5))
List(List(1, 3, 6), List(4, 7, 8), List(2, 5))
List(List(1, 3, 7), List(4, 6, 8), List(2, 5))
List(List(1, 3, 8), List(4, 6, 7), List(2, 5))
List(List(1, 4, 6), List(3, 7, 8), List(2, 5))
List(List(1, 4, 7), List(3, 6, 8), List(2, 5))
List(List(1, 4, 8), List(3, 6, 7), List(2, 5))
List(List(1, 6, 7), List(3, 4, 8), List(2, 5))
List(List(1, 6, 8), List(3, 4, 7), List(2, 5))
List(List(1, 7, 8), List(3, 4, 6), List(2, 5))
List(List(1, 3, 5), List(6, 7, 8), List(2, 4))
List(List(1, 3, 6), List(5, 7, 8), List(2, 4))
List(List(1, 3, 7), List(5, 6, 8), List(2, 4))
List(List(1, 3, 8), List(5, 6, 7), List(2, 4))
List(List(1, 5, 6), List(3, 7, 8), List(2, 4))
List(List(1, 5, 7), List(3, 6, 8), List(2, 4))
List(List(1, 5, 8), List(3, 6, 7), List(2, 4))
List(List(1, 6, 7), List(3, 5, 8), List(2, 4))
List(List(1, 6, 8), List(3, 5, 7), List(2, 4))
List(List(1, 7, 8), List(3, 5, 6), List(2, 4))
List(List(1, 4, 5), List(6, 7, 8), List(2, 3))
List(List(1, 4, 6), List(5, 7, 8), List(2, 3))
List(List(1, 4, 7), List(5, 6, 8), List(2, 3))
List(List(1, 4, 8), List(5, 6, 7), List(2, 3))
List(List(1, 5, 6), List(4, 7, 8), List(2, 3))
List(List(1, 5, 7), List(4, 6, 8), List(2, 3))
List(List(1, 5, 8), List(4, 6, 7), List(2, 3))
List(List(1, 6, 7), List(4, 5, 8), List(2, 3))
List(List(1, 6, 8), List(4, 5, 7), List(2, 3))
List(List(1, 7, 8), List(4, 5, 6), List(2, 3))
List(List(2, 3, 4), List(5, 6, 7), List(1, 8))
List(List(2, 3, 5), List(4, 6, 7), List(1, 8))
List(List(2, 3, 6), List(4, 5, 7), List(1, 8))
List(List(2, 3, 7), List(4, 5, 6), List(1, 8))
List(List(2, 4, 5), List(3, 6, 7), List(1, 8))
List(List(2, 4, 6), List(3, 5, 7), List(1, 8))
List(List(2, 4, 7), List(3, 5, 6), List(1, 8))
List(List(2, 5, 6), List(3, 4, 7), List(1, 8))
List(List(2, 5, 7), List(3, 4, 6), List(1, 8))
List(List(2, 6, 7), List(3, 4, 5), List(1, 8))
List(List(2, 3, 4), List(5, 6, 8), List(1, 7))
List(List(2, 3, 5), List(4, 6, 8), List(1, 7))
List(List(2, 3, 6), List(4, 5, 8), List(1, 7))
List(List(2, 3, 8), List(4, 5, 6), List(1, 7))
List(List(2, 4, 5), List(3, 6, 8), List(1, 7))
List(List(2, 4, 6), List(3, 5, 8), List(1, 7))
List(List(2, 4, 8), List(3, 5, 6), List(1, 7))
List(List(2, 5, 6), List(3, 4, 8), List(1, 7))
List(List(2, 5, 8), List(3, 4, 6), List(1, 7))
List(List(2, 6, 8), List(3, 4, 5), List(1, 7))
List(List(2, 3, 4), List(5, 7, 8), List(1, 6))
List(List(2, 3, 5), List(4, 7, 8), List(1, 6))
List(List(2, 3, 7), List(4, 5, 8), List(1, 6))
List(List(2, 3, 8), List(4, 5, 7), List(1, 6))
List(List(2, 4, 5), List(3, 7, 8), List(1, 6))
List(List(2, 4, 7), List(3, 5, 8), List(1, 6))
List(List(2, 4, 8), List(3, 5, 7), List(1, 6))
List(List(2, 5, 7), List(3, 4, 8), List(1, 6))
List(List(2, 5, 8), List(3, 4, 7), List(1, 6))
List(List(2, 7, 8), List(3, 4, 5), List(1, 6))
List(List(2, 3, 4), List(6, 7, 8), List(1, 5))
List(List(2, 3, 6), List(4, 7, 8), List(1, 5))
List(List(2, 3, 7), List(4, 6, 8), List(1, 5))
List(List(2, 3, 8), List(4, 6, 7), List(1, 5))
List(List(2, 4, 6), List(3, 7, 8), List(1, 5))
List(List(2, 4, 7), List(3, 6, 8), List(1, 5))
List(List(2, 4, 8), List(3, 6, 7), List(1, 5))
List(List(2, 6, 7), List(3, 4, 8), List(1, 5))
List(List(2, 6, 8), List(3, 4, 7), List(1, 5))
List(List(2, 7, 8), List(3, 4, 6), List(1, 5))
List(List(2, 3, 5), List(6, 7, 8), List(1, 4))
List(List(2, 3, 6), List(5, 7, 8), List(1, 4))
List(List(2, 3, 7), List(5, 6, 8), List(1, 4))
List(List(2, 3, 8), List(5, 6, 7), List(1, 4))
List(List(2, 5, 6), List(3, 7, 8), List(1, 4))
List(List(2, 5, 7), List(3, 6, 8), List(1, 4))
List(List(2, 5, 8), List(3, 6, 7), List(1, 4))
List(List(2, 6, 7), List(3, 5, 8), List(1, 4))
List(List(2, 6, 8), List(3, 5, 7), List(1, 4))
List(List(2, 7, 8), List(3, 5, 6), List(1, 4))
List(List(2, 4, 5), List(6, 7, 8), List(1, 3))
List(List(2, 4, 6), List(5, 7, 8), List(1, 3))
List(List(2, 4, 7), List(5, 6, 8), List(1, 3))
List(List(2, 4, 8), List(5, 6, 7), List(1, 3))
List(List(2, 5, 6), List(4, 7, 8), List(1, 3))
List(List(2, 5, 7), List(4, 6, 8), List(1, 3))
List(List(2, 5, 8), List(4, 6, 7), List(1, 3))
List(List(2, 6, 7), List(4, 5, 8), List(1, 3))
List(List(2, 6, 8), List(4, 5, 7), List(1, 3))
List(List(2, 7, 8), List(4, 5, 6), List(1, 3))
List(List(3, 4, 5), List(6, 7, 8), List(1, 2))
List(List(3, 4, 6), List(5, 7, 8), List(1, 2))
List(List(3, 4, 7), List(5, 6, 8), List(1, 2))
List(List(3, 4, 8), List(5, 6, 7), List(1, 2))
List(List(3, 5, 6), List(4, 7, 8), List(1, 2))
List(List(3, 5, 7), List(4, 6, 8), List(1, 2))
List(List(3, 5, 8), List(4, 6, 7), List(1, 2))
List(List(3, 6, 7), List(4, 5, 8), List(1, 2))
List(List(3, 6, 8), List(4, 5, 7), List(1, 2))
List(List(3, 7, 8), List(4, 5, 6), List(1, 2))

希望这次我解决了正确的问题?

【讨论】:

    【解决方案2】:
    scala> val list = List(1,2,3,4)
    // l: List[Int] = List(1, 2, 3, 4)
    
    scala> val setList = list.toSet.subsets(2).toList
    // setList: List[scala.collection.immutable.Set[Int]] = List(Set(1, 2), Set(1, 3), Set(1, 4), Set(2, 3), Set(2, 4), Set(3, 4))
    
    scala> val tupleList = setList.map(_.toList).map({ case List(x, y) => (x, y)})
    // tupleList: List[(Int, Int)] = List((1,2), (1,3), (1,4), (2,3), (2,4), (3,4))
    

    【讨论】:

    • 对不起,不是我想要的,请看我的例子 List( List((1,2),(3,4)), List((1,3),(2,4)) , 列表((1,4),(2,3)) )
    【解决方案3】:

    好的,到目前为止,这就是我所拥有的:

    scala> List(1,2,3,4).permutations.map(x => x.sliding(2,2).toSet).flatten.map(z => z.sorted).toSet
    res24: scala.collection.immutable.Set[List[Int]] = Set(List(3, 4), List(1, 2), List(2, 3), List(1, 4), List(2, 4), List(1, 3))
    

    我认为这更接近预期的结果,但并不完全符合预期的格式。

    编辑:

    到目前为止一切顺利:

    scala> val resultSet = List(1,2,3,4).permutations.map(x => x.sliding(2,2).toSet).flatten.map(z => z.sorted).toSet.toList
    resultSet: List[List[Int]] = List(List(3, 4), List(1, 2), List(2, 3), List(1, 4), List(2, 4), List(1, 3))
    
    scala> resultSet.reverse.sliding(2,2).toList
    res1: List[List[List[Int]]] = List(List(List(1, 3), List(2, 4)), List(List(1, 4), List(2, 3)), List(List(1, 2), List(3, 4)))
    

    是的,这仅在您想要大小为 2 的元组而不是非常动态的情况下才有效。 ¯\_(ツ)_/¯

    【讨论】:

    • 嗨,谢谢。但该解决方案不适用于其他参数:例如滑动(3,3)与列表 1 到 9
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2020-04-05
    • 2019-10-20
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多