2016-11-30 5 views
0

Ich möchte einen Vektor von Tuple von zwei Ints generieren. Für jetzt mache ich wie folgt:Scala: Erzeuge Tupel von Ints

(0 until 100).map(x => (x+1 until 100).map(y => (x,y))).flatten.filter { ... } 

Ich fragte mich, ob es eine effizientere Möglichkeit, dies zu tun wäre. Ich habe das Gefühl, dass "flatten" den Code verlangsamt. Muss ich "flatten" oder kann ich etwas anderes benutzen?

PS1: Wenn ich nicht "flatten" verwende, habe ich: Vektor (Vektor (a, b), Vektor (c, d), ...) und nicht Vektor ((a, b), (CD),...).

PS2: Ich benutze (x + 1 bis 100) im zweiten Generator, da ich nicht daran interessiert bin, Tupel (a, b) und (b, a) zu haben.

Antwort

7
for { 
    i <- 0 until 100 
    j <- i+1 until 100 
} yield (i,j) 
0

map(f).flatten kann flatMap(f) verkürzt werden, so dass Sie

(0 until 100).flatMap(x => (x+1 until 100).map(y => (x,y))).filter(...) 

Dies entspricht Tzach Zohar Antwort bekommen, aber Sie die Beziehung sehen. Es kann sich auch lohnen, filter in flatMap zu verschieben (es wird öfter aufgerufen, aber Sie erhalten kleinere Zwischensammlungen).