访问列表中的下一个元素以在Scala中进行比较

Dan*_*Dan 11 scala list

我是Scala的新手,我想知道如何调用列表的下一个元素,因为我试图将当前元素与相邻元素进行比较.给定x作为当前元素,我尝试类似于java,x + 1但是没有用.有帮助吗?

for (x <- list; if (x == (next adj. element))) println("same")
Run Code Online (Sandbox Code Playgroud)

Lan*_*dei 33

滑动怎么样?

val list = List(1,2,3,4)
list.sliding(2).foreach(println)

//List(1, 2)
//List(2, 3)
//List(3, 4)
Run Code Online (Sandbox Code Playgroud)


Rex*_*err 7

for循环中执行此操作的规范方法是:

scala> val xs = List(1,2,3,4,3,2)
xs: List[Int] = List(1, 2, 3, 4, 3, 2)

scala> for (List(left,right) <- xs.sliding(2) if (left < right)) println(left + " < " + right)
1 < 2
2 < 3
3 < 4

scala> for ((left,right) <- (xs zip xs.tail) if (left < right)) println(left + " < " + right)
1 < 2
2 < 3
3 < 4
Run Code Online (Sandbox Code Playgroud)

(顺便说一下,你可能最好把if语句放在外面而不是在这个例子中的for comprehension里面.)

如果您有索引而不是值,则只需使用相同的模式取消引用它们.就个人而言,我没有发现这种模式非常清楚或有用.它很慢,有一些奇怪的角落案例,列表不完整,并且很难跟踪正在发生的事情.相反,我定义

class PairedIterable[A](it: Iterable[A]) {
  def foreachpair(f: (A,A) => Unit) = {
    val i = it.iterator
    if (i.hasNext) {
      var prev = i.next
      while (!ans && i.hasNext) {
        val x = i.next
        f(prev,x)
        prev = x
      }
    }
  }
}
implicit def iterable_has_pairs[A](it: Iterable[A]) = new PairedIterable(it)
Run Code Online (Sandbox Code Playgroud)

然后可以像这样使用:

scala> xs.foreachpair((left, right) => if (left < right) println(left + " < " + right))
1 < 2
2 < 3
3 < 4
Run Code Online (Sandbox Code Playgroud)

变体"forallpair","existspair"和"findpair"特别有用.


use*_*own -1

scala> val li = List (3, 4, 5) 
li: List[Int] = List(3, 4, 5)

scala> li.tail.head 
res74: Int = 4
Run Code Online (Sandbox Code Playgroud)

如果您不想只比较单个元素,而是想比较任意长度的序列,则可以在递归函数中进行:

def compAdjectent (l: List [Int]) : Boolean = l match {
  case Nil => false 
  case x :: Nil => false 
  case x :: y :: xs => if (x.equals (y)) true else compAdjectent (y :: xs)
}
Run Code Online (Sandbox Code Playgroud)