¿Cuál es la forma correcta de obtener un subarreglo en Scala?

95

Estoy tratando de obtener un subarreglo en scala, y estoy un poco confundido sobre cuál es la forma correcta de hacerlo. Lo que más me gustaría sería algo como cómo puedes hacerlo en Python:

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

pero estoy bastante seguro de que no puede hacer esto.

La forma más obvia de hacerlo sería utilizar la biblioteca de utilidades Java Arrays.

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

Pero siempre me hace sentir un poco sucio usar bibliotecas Java en Scala. La forma más "escalada" que encontré de hacerlo sería

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
}

¿Pero hay una manera mejor?

nnythm
fuente

Respuestas:

131

Puede llamar al método slice:

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

Funciona como en Python.

paradigmático
fuente
3
oh, por supuesto, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , soy tonto.
nnythm
Sí tienes razón. Me refería a las convenciones encuadernadas. Se incluye el límite inferior y se excluye el superior. Tampoco hay seguimiento :.
paradigmático
@nnythm El enlace es cabeza.
Amir A. Shabani
14

Imagina que tienes una matriz con elementos de aaf

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

Luego, puede extraer una submatriz de diferentes maneras:

  1. Soltando los primeros n primeros elementos con drop(n: Int)

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

  2. Tome los primeros n elementos con take(n: Int)

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

  3. Seleccione cualquier intervalo de elementos con slice(from: Int, until: Int). Tenga en cuenta que untilestá excluido.

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

    El método de corte es estrictamente equivalente a:
    array.take(4).drop(2) // Array('c','d')

  4. Excluya los últimos n elementos con dropRight(n: Int):

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

  5. Seleccione los últimos n elementos con takeRight(n: Int):

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

Referencia : documentación oficial

KeyMaker00
fuente
1

Un ejemplo de extracción de columnas específicas de 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
Athanasios Tsiaras
fuente