Как правильно получить подмассив в Scala?


Я пытаюсь получить subarray в scala, и я немного смущен тем, что правильный способ сделать это. То, что я хотел бы больше всего было бы что-то вроде того, как вы можете сделать это в python:

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

но я совершенно уверен, что вы не можете этого сделать.

наиболее очевидным способом сделать это было бы использовать Java массивы util библиотеки.

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

но это всегда заставляет меня чувствовать себя немного грязно, чтобы использовать библиотеки Java в Scala. Самый "скалейный" способ, который я нашел сделать это было бы

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
}

но есть ли лучший способ?

2 80

2 ответа:

вы можете вызвать метод slice:

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

он работает как в python.

представьте, что у вас есть массив с элементами от a to f

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

затем вы можете извлечь суб-массив из него по-разному:

  1. отбрасывание первых n первых элементов с drop(n: Int)

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

  2. возьмите первые n элементов с take(n: Int)

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

  3. выберите любой интервал элементов с slice(from: Int, until: Int). Обратите внимание, что until is исключенный.

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

    метод среза строго эквивалентен:
    array.take(4).drop(2) // Array('c','d')

  4. исключить последние n элементов dropRight(n: Int):

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

  5. выберите последние n элементов с помощью takeRight(n: Int):

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

ссылка:официальная документация