Qual é a maneira correta de obter um subarray no Scala?

94

Estou tentando obter um subarray em scala e estou um pouco confuso sobre qual é a maneira correta de fazer isso. O que eu mais gostaria seria algo como você pode fazer isso em python:

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

mas estou quase certo de que você não pode fazer isso.

A maneira mais óbvia de fazer isso seria usar a biblioteca de utilitários Java Arrays.

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

Mas sempre me sinto um pouco sujo usar bibliotecas Java no Scala. A maneira mais "escalonada" que encontrei de fazer isso seria

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
}

mas existe uma maneira melhor?

nnythm
fonte

Respostas:

130

Você pode chamar o método de fatia:

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

Funciona como em python.

paradigmático
fonte
2
ah, claro, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , sou burro.
nnythm
Sim, você está certo. Eu estava me referindo às convenções vinculadas. O limite inferior é incluído e o superior é excluído. Não há nenhum rastro :.
paradigmático de
13

Imagine que você tem uma matriz com elementos de aaf

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

Em seguida, você pode extrair uma submatriz de maneiras diferentes:

  1. Eliminando os primeiros n primeiros elementos com drop(n: Int)

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

  2. Pegue os primeiros n elementos com take(n: Int)

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

  3. Selecione qualquer intervalo de elementos com slice(from: Int, until: Int). Observe que untilestá excluído.

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

    O método de fatia é estritamente equivalente a:
    array.take(4).drop(2) // Array('c','d')

  4. Exclua os últimos n elementos com dropRight(n: Int):

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

  5. Selecione os últimos n elementos com takeRight(n: Int):

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

Referência : documentação oficial

KeyMaker00
fonte
1

Um exemplo de extração de colunas específicas de um 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
fonte