wake-up-neo.com

Was ist der richtige Weg, um ein Subarray in Scala zu bekommen?

Ich versuche, ein Subarray in Scala zu bekommen, und ich bin ein wenig verwirrt, was die richtige Art und Weise ist, dies zu tun. Was ich am liebsten hätte, wäre, wie man es in Python machen kann:

x = [3, 2, 1]
x[0:2]

aber ich bin mir ziemlich sicher, dass Sie das nicht können.

Die naheliegendste Möglichkeit wäre, die util-Bibliothek für Java Arrays zu verwenden.

import Java.util.Arrays
val start = Array(1, 2, 3)
Arrays.copyOfRange(start, 0, 2)

Aber es macht mich immer ein bisschen dreckig, Java - Bibliotheken in Scala zu benutzen. Die "scalaic" Weise, die ich fand, um es zu tun, würde sein

def main(args: List[String]) {
    val start = Array(1, 2, 3)
    arrayCopy(start, 0, 2)
}
def arrayCopy[A](arr: Array[A], start: Int, end: Int)(implicit manifest: Manifest[A]): Array[A] = {
    val ret = new Array(end - start)
    Array.copy(arr, start, ret, 0, end - start)
    ret
}

aber gibt es einen besseren Weg?

86
nnythm

Sie können die Slice-Methode aufrufen:

scala> Array("foo", "hoo", "goo", "ioo", "joo").slice(1, 4)
res6: Array[Java.lang.String] = Array(hoo, goo, ioo)

Es funktioniert wie in Python.

119
paradigmatic

Stellen Sie sich vor, Sie haben ein Array mit Elementen von a bis f.

scala> val array = ('a' to 'f').toArray // Array('a','b','c','d','e','f')

Dann können Sie ein Sub-Array auf verschiedene Arten daraus extrahieren:

  1. Löschen der ersten n ersten Elemente mit drop(n: Int)

    array.drop(2) // Array('c','d','e','f')

  2. Nimm die ersten n Elemente mit take(n: Int)

    array.take(4) // Array('a','b','c','d')

  3. Wählen Sie mit slice(from: Int, until: Int) ein beliebiges Elementintervall aus. Beachten Sie, dass until ausgeschlossen ist.

    array.slice(2,4) // Array('c','d')

    Die Slice-Methode ist genau gleichbedeutend mit:
    array.take(4).drop(2) // Array('c','d')

  4. Schließen Sie die letzten n Elemente mit dropRight(n: Int) aus:

    array.dropRight(4) // Array('a','b')

  5. Wählen Sie die letzten n Elemente mit takeRight(n: Int) aus:

    array.takeRight(4) // Array('c','d','e','f')

Referenz : Offizielle Dokumentation

9
KeyMaker00