用 Scala 交换列表的所有整数

Swap all Integers of a List with Scala

如果我有交换方法,可以交换列表中的两个整数:

def swap[E]: (List[E], Int, Int) => List[E] = (ls, i, j) => 
  ls.updated(i, ls(j)).updated(j, ls(i))

现在我想使用此方法交换列表中的所有整数。这意味着结果应该是这样的:

swapAll(List(1,2,3)) == List(List(2,1,3), List(3,2,1), List(1,3,2))

我想到了这样的事情:

def swapAll: List[Int] => List[List[Int]] = ls => for(i <- 0 to ls.length; j <- i to ls.length) yield List(swap(ps, i, j))

但它不起作用,有人有想法吗?

快到了。

def swap[E](ls: List[E], i: Int, j: Int): List[E] = {
  ls.updated(i, ls(j)).updated(j, ls(i))
}


def swapAll(ps: List[Int]): List[List[Int]] = {
  val n = ps.size
  (for {
    i <- 0 until n
    j <- (i + 1) until n
  } yield swap(ps, i, j))(collection.breakOut)
}

示例:

swapAll(List(1, 2, 3))
// List(List(2, 1, 3), List(3, 2, 1), List(1, 3, 2))

breakOut是一个特殊的显式插入CanBuildFrom。这是必要的,因为没有它,生成的集合的类型是从 0 until n Range 派生的一些奇怪的 IndexedSequence,但你想要一个 List