Qual è il modo corretto per ottenere un sottoarray in Scala?


94

Sto cercando di ottenere un sottoarray in scala e sono un po 'confuso su quale sia il modo corretto di farlo. Quello che mi piacerebbe di più sarebbe qualcosa come come puoi farlo in Python:

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

ma sono abbastanza certo che non puoi farlo.

Il modo più ovvio per farlo sarebbe utilizzare la libreria di utilità Java Arrays.

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

Ma mi fa sempre sentire un po 'sporco usare le librerie Java in Scala. Il modo più "scalaico" che ho trovato per farlo sarebbe stato

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
}

ma c'è un modo migliore?

Risposte:



13

Immagina di avere un array con elementi da aaf

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

Quindi puoi estrarre un sotto-array da esso in diversi modi:

  1. Eliminando i primi n primi elementi con drop(n: Int)

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

  2. Prendi i primi n elementi con take(n: Int)

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

  3. Seleziona qualsiasi intervallo di elementi con slice(from: Int, until: Int). Nota che untilè escluso.

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

    Il metodo slice è strettamente equivalente a:
    array.take(4).drop(2) // Array('c','d')

  4. Escludi gli ultimi n elementi con dropRight(n: Int):

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

  5. Seleziona gli ultimi n elementi con takeRight(n: Int):

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

Riferimento : documentazione ufficiale


1

Un esempio di estrazione di colonne specifiche da un Scala Array 2D (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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.