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

94

Ich versuche, ein Subarray in Scala zu bekommen, und ich bin ein wenig verwirrt darüber, wie es richtig gemacht wird. Was ich am liebsten hätte, wäre so etwas wie das in Python:

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

aber ich bin ziemlich sicher, dass Sie dies nicht tun können.

Der naheliegendste Weg, dies zu tun, wäre die Verwendung der Java Arrays util-Bibliothek.

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

Aber es macht mich immer ein bisschen schmutzig, Java-Bibliotheken in Scala zu verwenden. Der "skalaischste" Weg, den ich gefunden habe, wäre

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?

nnythm
quelle

Antworten:

129

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.

paradigmatisch
quelle
2
Oh, natürlich, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , ich bin dumm.
nnythm
Ja, du hast Recht. Ich bezog mich auf die gebundenen Konventionen. Die Untergrenze ist enthalten und die Obergrenze ist ausgeschlossen. Es gibt auch kein Nachlaufen :.
Paradigmatisch
13

Stellen Sie sich vor, Sie haben ein Array mit Elementen von abisf

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 ein beliebiges Intervall von Elementen mit slice(from: Int, until: Int). Beachten Sie, dass dies untilausgeschlossen ist.

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

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

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

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

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

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

Referenz : Offizielle Dokumentation

KeyMaker00
quelle
0

Ein Beispiel für das Extrahieren bestimmter Spalten aus einem 2D-Scala-Array (original_array):

import scala.collection.mutable.ArrayBuffer

val sub_array = ArrayBuffer[Array[String]]()
val columns_subset: Seq[String] = Seq("ColumnA", "ColumnB", "ColumnC")
val columns_original = original_array(0)

for (column_now <- columns_subset) {
      sub_array += original_array.map{_(columns_original.indexOf(column_now))}
    }
sub_array
Athanasios Tsiaras
quelle