2011-04-20 54 views
8

我是新來的斯卡拉,我想知道如何調用列表的下一個元素,因爲我試圖比較當前元素與相鄰的元素。 給定x作爲當前元素,我嘗試類似於java,x + 1,但沒有奏效。任何幫助?訪問列表中的下一個元素在斯卡拉比較

for (x <- list; if (x == (next adj. element))) println("same") 
+1

請張貼一些代碼。如果x是當前元素的(值),那麼x + 1也不會成爲Java中的下一個元素。如果它是下一個元素的索引,那麼事情應該起作用。 – 2011-04-20 11:08:48

回答

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

scala> li.tail.head 
res74: Int = 4 
+0

但即時通訊嘗試用for循環迭代列表。我沒有看到如何工作。 like(l < - li; if(l!= l + 1))... – Dan 2011-04-20 07:38:37

+0

@Dan潛意識消息是你做錯了。:-) – 2011-04-20 23:01:46

2

正如你可以使用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) 
     } 

    } 
    } 
} 
+2

你甚至可以做'case head :: second :: rest => ...' – ziggystar 2011-04-20 08:09:57

26

如何滑動?

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

//List(1, 2) 
//List(2, 3) 
//List(3, 4) 
2
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> 
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 

(順便說一句,你可能會更好過把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」 是特別有用的。

3

這將通過遞歸在列表,而不是通過元素迭代,因爲元素不知道名單什麼方法可以更好地處理。

例如:

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

list.tail.head

,如果你想通過從列表前面的所有元素給人的下一個元素。這是因爲頭是最前面的元素,尾是列表的其餘部分。

0

如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