[英]Accessing the next element in list to compare in Scala
我是 Scala 的新手,我想知道如何调用列表的下一个元素,因为我正在尝试将当前元素与相邻元素进行比较。 给定 x 作为当前元素,我尝试了类似于 java, x+1 的方法,但是没有用。 有什么帮助吗?
for (x <- list; if (x == (next adj. element))) println("same")
滑动呢?
val list = List(1,2,3,4)
list.sliding(2).foreach(println)
//List(1, 2)
//List(2, 3)
//List(3, 4)
在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
(顺便说一下,在这个例子中,你最好把 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)
然后可以像这样使用:
scala> xs.foreachpair((left, right) => if (left < right) println(left + " < " + right))
1 < 2
2 < 3
3 < 4
变体“forallpair”、“existspair”和“findpair”特别有用。
这可以通过递归遍历列表而不是遍历元素来更好地处理,因为元素对列表一无所知。
例如:
def recurse[T](list: List[T]): Unit = list match {
case List(x, y, _*) if x == y =>
println("same")
recurse(list.tail)
case Nil =>
case _ => recurse(list.tail)
}
作为一种选择,您可以使用match
和 recursion 而不是for
:
object Test {
def main(args: Array[String]) {
val list = List(1, 5, 3)
loop(list)
}
def loop(list: List[Int]) {
list match {
case Nil => println("Empty list")
case x :: Nil => println("last " + x)
case x :: tail => {
println(x + " - " + tail.head)
loop(tail)
}
}
}
}
scala> val xs = 1::3::5::4::Nil
xs: List[Int] = List(1, 3, 5, 4)
scala> (xs, xs.tail).zip.foreach(println)
(1,3)
(3,5)
(5,4)
scala>
在 Scala 2.11.7 中,以下内容是有效的:
scala> val xs = List(1,2,3,4)
xs: List[Int] = List(1, 2, 3, 4)
1) 拉上尾巴
scala> xs.zip(xs.tail)
res0: List[(Int, Int)] = List((1,2), (2,3), (3,4))
2)滑动窗口
scala> xs.sliding(2)
res1: Iterator[List[Int]] = non-empty iterator
列表.tail.head
如果要遍历列表前面的所有元素,则给出下一个元素。 这是因为头部是最前面的元素,尾部是列表的其余部分。
scala> val li = List (3, 4, 5)
li: List[Int] = List(3, 4, 5)
scala> li.tail.head
res74: Int = 4
如果您不想只比较单个元素,而是要比较任意长度的序列,则可以在递归函数中进行:
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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.