如果我有一个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))
但这不起作用,有人有想法吗?
答案 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
。