Scala:减去奇数值的索引

时间:2017-04-14 13:43:31

标签: scala patch

对于实际练习,我需要定义一个函数,它基本上改变了列表中奇数索引中每个值的索引,这样我就可以得到:

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

2 个答案:

答案 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
  }
}