Канонические способы сделать это в цикле 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 снаружи, а не внутри для понимания).)
Если у вас есть индексы вместо значений, вы просто разыменовываете их, используя тот же шаблон.Лично я не нахожу эту модель очень четкой или полезной.Это медленно, имеет странные угловые случаи со списками, которые не полны, и трудно следить за тем, что происходит.Вместо этого я определяю
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", "existpair" и "findpair" особенно полезны.