web-dev-qa-db-fra.com

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

J'essaie d'obtenir un sous-tableau en scala et je suis un peu confus quant à la manière appropriée de le faire. Ce que je voudrais le plus, ce serait de savoir 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 Java Arrays util.

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

Mais je me sens toujours un peu sale d’utiliser les bibliothèques Java de Scala. La façon la plus "scalaic" que j’ai trouvée de le faire serait de

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?

86
nnythm

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.

119
paradigmatic

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. Supprimer les n premiers premiers éléments avec drop(n: Int)

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

  2. Prenons 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 until 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

9
KeyMaker00