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?

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.


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.