Quelle est la bonne façon d'obtenir un sous-tableau dans Scala?

95

J'essaie d'obtenir un sous-tableau dans scala, et je ne sais pas trop quelle est la bonne façon de le faire. Ce que je voudrais le plus serait quelque chose comme comment vous pouvez le faire en python:

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

mais je suis assez certain que vous ne pouvez pas faire cela.

La manière la plus évidente de le faire serait d'utiliser la bibliothèque utilitaire Java Arrays.

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

Mais cela me fait toujours me sentir un peu sale d'utiliser les bibliothèques Java dans Scala. La manière la plus "scalaïque" que j'ai trouvée pour le faire serait

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
}

Mais y a-t-il une meilleure façon?

nnythm
la source

Réponses:

131

Vous pouvez appeler la méthode slice:

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

Cela fonctionne comme en python.

paradigmatique
la source
3
oh, bien sûr, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , je suis stupide.
nnythm
Oui tu as raison. Je faisais référence aux conventions liées. La limite inférieure est incluse et la limite supérieure est exclue. Il n'y a pas non plus de fin :.
paradigmatic
@nnythm Le lien est head.
Amir A. Shabani il y a
14

Imaginez que vous ayez un tableau avec des éléments de aàf

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

Ensuite, vous pouvez en extraire un sous-tableau de différentes manières:

  1. Déposer les n premiers éléments avec drop(n: Int)

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

  2. Prenez les n premiers éléments avec take(n: Int)

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

  3. Sélectionnez n'importe quel intervalle d'éléments avec slice(from: Int, until: Int). Notez que untilc'est exclu.

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

    La méthode slice est strictement équivalente à:
    array.take(4).drop(2) // Array('c','d')

  4. Excluez les n derniers éléments avec dropRight(n: Int):

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

  5. Sélectionnez les n derniers éléments avec takeRight(n: Int):

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

Référence : documentation officielle

KeyMaker00
la source
1

Un exemple d'extraction de colonnes spécifiques d'un tableau Scala 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
la source