2017-11-16 3 views
0

Sagen Sie zum Beispiel, ich mappe eine Liste auf die nächste, und in der Karte möchte ich eine Berechnung mit dem aktuellen Element in der Liste mit dem nächsten Element in der Liste.Scala erhalten nächsten Index in der Liste von aktuellen Artikel

def someFunc(L: List[Integer]) : List[Integer] = { 
    L.collect { 
     case k if (k != L(L.length-1)) //do something with k and the next element 
    } 
} 

Ein einfaches Beispiel ist ich durch diese Liste der ganzen Zahlen gehen möchten, und ordnen jede Zahl auf die nächste Nummer in der Liste, indem sie geteilt.

z. (1,2,3) -> (2/1, 3/2) == (2, 1.5)

Ich hatte darüber nachgedacht, dies mit indexOf zu tun, aber ich denke nicht, dass es effizient ist, das zu suchen ganze Liste für das aktuelle Element, obwohl ich sowieso schon jedes Element in der Liste durchquere.

Antwort

4

Verwenden .sliding hierfür:

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

scala> l.sliding(2).toList 
res0: List[List[Int]] = List(List(1, 2), List(2, 3)) 

scala> l.sliding(2).collect { case x::y::Nil if y != 0 => x/y.toDouble }.toList 
res1: List[Double] = List(0.5, 0.6666666666666666) 
+1

Sie haben die x und y in der falschen Reihenfolge, sollte 'y/x' sein, aber die Logik funktioniert. Vielen Dank – NotAPro

Verwandte Themen