用 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
。
如果我有交换方法,可以交换列表中的两个整数:
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
。