用Scala交换列表的所有整数

时间:2018-07-07 23:48:31

标签: scala list loops integer swap

如果我有一个swap方法,该方法可以交换List中的两个Integer:

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

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

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

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

1 个答案:

答案 0 :(得分:3)

快到了。

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。这是必要的,因为没有它,生成的集合的类型是从IndexedSequence 0 until n派生出来的某种奇怪的Range,但是您想要的是List