Как правильно получить подмассив в 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 ответа:
вы можете вызвать метод slice:
scala> Array("foo", "hoo", "goo", "ioo", "joo").slice(1, 4) res6: Array[java.lang.String] = Array(hoo, goo, ioo)
он работает как в python.
представьте, что у вас есть массив с элементами от
a
tof
scala> val array = ('a' to 'f').toArray // Array('a','b','c','d','e','f')
затем вы можете извлечь суб-массив из него по-разному:
отбрасывание первых n первых элементов с
drop(n: Int)
array.drop(2) // Array('c','d','e','f')
возьмите первые n элементов с
take(n: Int)
array.take(4) // Array('a','b','c','d')
выберите любой интервал элементов с
slice(from: Int, until: Int)
. Обратите внимание, чтоuntil
is исключенный.
array.slice(2,4) // Array('c','d')
метод среза строго эквивалентен:
array.take(4).drop(2) // Array('c','d')
исключить последние n элементов
dropRight(n: Int)
:
array.dropRight(4) // Array('a','b')
выберите последние n элементов с помощью
takeRight(n: Int)
:
array.takeRight(4) // Array('c','d','e','f')
ссылка:официальная документация