我是新來的斯卡拉,我想知道如何調用列表的下一個元素,因爲我試圖比較當前元素與相鄰的元素。 給定x作爲當前元素,我嘗試類似於java,x + 1,但沒有奏效。任何幫助?訪問列表中的下一個元素在斯卡拉比較
for (x <- list; if (x == (next adj. element))) println("same")
我是新來的斯卡拉,我想知道如何調用列表的下一個元素,因爲我試圖比較當前元素與相鄰的元素。 給定x作爲當前元素,我嘗試類似於java,x + 1,但沒有奏效。任何幫助?訪問列表中的下一個元素在斯卡拉比較
for (x <- list; if (x == (next adj. element))) println("same")
scala> val li = List (3, 4, 5)
li: List[Int] = List(3, 4, 5)
scala> li.tail.head
res74: Int = 4
但即時通訊嘗試用for循環迭代列表。我沒有看到如何工作。 like(l < - li; if(l!= l + 1))... – Dan 2011-04-20 07:38:37
@Dan潛意識消息是你做錯了。:-) – 2011-04-20 23:01:46
正如你可以使用match
選項和遞歸而不是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)
}
}
}
}
你甚至可以做'case head :: second :: rest => ...' – ziggystar 2011-04-20 08:09:57
如何滑動?
val list = List(1,2,3,4)
list.sliding(2).foreach(println)
//List(1, 2)
//List(2, 3)
//List(3, 4)
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>
的規範方式在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」, 「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)
}
list.tail.head
,如果你想通過從列表前面的所有元素給人的下一個元素。這是因爲頭是最前面的元素,尾是列表的其餘部分。
如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
請張貼一些代碼。如果x是當前元素的(值),那麼x + 1也不會成爲Java中的下一個元素。如果它是下一個元素的索引,那麼事情應該起作用。 – 2011-04-20 11:08:48