2012-06-28 6 views

Antwort

58
val xs = List(1,2,3,4) 
xs zip xs.tail 
    // res1: List[(Int, Int)] = List((1,2), (2,3), (3,4)) 

zu produzieren Da die docs sagen, zip

eine Liste aus dieser Liste und anderen iterable Sammlung gebildet Kosten durch entsprechende paarweise Kombination von Elementen. Wenn eine der beiden Sammlungen länger ist als die andere, werden die übrigen Elemente ignoriert.

So List('a,'b,'c,'d) mit List('x,'y,'z) Reißverschluss ist List(('a,'x), ('b,'y), ('c,'z)) mit dem endgültigen 'd des ersten ignoriert.

Von Ihrem Beispiel ist die tail von List(1,2,3,4)List(2,3,4), so dass Sie sehen können, wie diese paarweise zusammen reißen.

+1

Das ist kurz und schlau, aber es ist schwerer zu verstehen, denke ich. –

+3

Dies wäre meine erste Wahl für Prägnanz und Klarheit. Habe eine Verbesserung. – Brian

+1

@Luigi: Ich habe diese Antwort hochgestuft und ziehe sie der aktuell akzeptierten vor, aber eine Erklärung wäre hilfreicher als "LOL, wenn du denkst, dass das schwer zu verstehen ist". –

10

Um eine Liste von Paaren (dh Tupel) versuchen, dieses

List(1,2,3,4,5).sliding(2).collect{case List(a,b) => (a,b)}.toList 
+1

Verwenden 'statt' collect' map' - das wird ein 'isDefinedAt' Aufruf speichern und eine Ausnahme, wenn ganz plötzlich Ihre ursprünglichen Sammlung werfen nicht mehr ein' list' ist, statt eine leise Herstellung leeres Ergebnis Aus demselben Grund sollten Sie 'Seq (a, b)' anstelle von 'List (a, b)' wahrscheinlich pattern-matching. –

6
List(1,2,3,4).sliding(2).map(x => (x.head, x.tail.head)).toList 
res0: List[(Int, Int)] = List((1,2), (2,3), (3,4)) 
+1

Dies ist die Antwort, die ich auch bei der Erstellung des Dokuments erhalten habe. Scheint offensichtlicher und lesbarer als der Rest imo. – arviman

+0

@arviman Das ist, was ich zu der Zeit dachte. Ich habe wahrscheinlich versucht, den Gebrauch von 'sliding' zu erzwingen. Im Nachhinein ist die angenommene Antwort viel besser. – Brian

Verwandte Themen