对于实际练习,我需要定义一个函数,它基本上改变了列表中奇数索引中每个值的索引,这样我就可以得到:
changePairs(List(1,2,3,4,5,6,7,8,9,10,11))
//> res62: List[Int] = List(2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 11)
changePairs(List(2,2,30,4,50,6,7,80,9,100))
//> res63: List[Int] = List(2, 2, 4, 30, 6, 50, 80, 7, 100, 9)
所以基本上我需要交换每个奇偶对的位置,如果我在最后一个索引(第一个例子中是11)留下一个奇数元素,我就把它保留原样。 / p>
我有这个,但它肯定不起作用,我不确定为什么。
def changePairs(a: List[Int]) = a.zipWithIndex.map {
case (s,i) => if (i % 2 != 0) a.patch(i,Seq(s),1); a.patch(i-2,Seq(s),0);
}
答案 0 :(得分:0)
这是一种方式:
def changePairs(a: List[Int]) = a.grouped(2).flatMap {
case List(a, b) => List(b, a)
case a => a
}.toList
changePairs(List(1, 2, 3, 4, 5, 6, 7)) // List(2, 1, 4, 3, 6, 5, 7)
让您前进的主要想法是,一旦您考虑将列表分组为两个元素的子列表,这就是grouped(2)
的作用。从那时起,这是一个轻松的旅程 - 描述两个案例,一个有两个元素(在这种情况下我们翻转它们)和一个只有一个元素,例如我的例子中的7,在这种情况下我们只是留下它。我们使用flatMap
将生成的2元素列表列表展平为一个大列表,然后我们.toList
退出我们从grouped
得到的迭代器。
编辑:
我现在在评论中看到了a.grouped(2).map(_.reverse).flatten.toList
。是的,这也是有效的,它与此相同但更简洁,因为不是“手动”交换元素,我们只在每个子列表上做reverse
。
答案 1 :(得分:0)
您还可以使用递归和模式匹配。这是有效的,因为您只浏览一次列表:
def changePairs(l: List[Int]): List[Int] = {
l match {
case a :: b :: tail => b :: a :: changePairs(tail)
case _ => Nil
}
}