105 votes

Quelle est la manière correcte d'obtenir un sous-tableau en Scala ?

J'essaie d'obtenir un sous tableau en scala, et je suis un peu confus sur la façon appropriée de le faire. Ce que j'aimerais le plus, c'est quelque chose comme ce que l'on peut faire en Python :

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

mais je suis presque certain que vous ne pouvez pas faire ça.

La façon 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 coupable d'utiliser des bibliothèques Java en Scala. La façon la plus "scalaïque" que j'ai trouvée pour 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 un meilleur moyen ?

141voto

paradigmatic Points 20871

Vous pouvez appeler la méthode de découpage :

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

Cela fonctionne comme en python.

16voto

KeyMaker00 Points 1174

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

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

Vous pouvez ensuite en extraire un sous-réseau de différentes manières :

  1. En laissant tomber 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 until est exclue.

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

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

  4. Exclure 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

1voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X