在Scala中获取子数组的正确方法是什么?

nny*_*thm 89 scala scala-collections

我试图在scala中得到一个子数组,我对它的正确方法有点困惑.我最想要的是你在python中如何做到这一点:

x = [3, 2, 1]
x[0:2]
Run Code Online (Sandbox Code Playgroud)

但我相当肯定你不能这样做.

最明显的方法是使用Java Arrays util库.

import java.util.Arrays
val start = Array(1, 2, 3)
Arrays.copyOfRange(start, 0, 2)
Run Code Online (Sandbox Code Playgroud)

但它总是让我觉得在Scala中使用Java库有点脏.我找到的最"scalaic"方式就是

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
}
Run Code Online (Sandbox Code Playgroud)

但有更好的方法吗?

par*_*tic 122

你可以调用切片方法:

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

它在python中工作.

  • *几乎*在Python中.没有负数魔法. (23认同)
  • 哦,当然,ArrayOps http://www.scala-lang.org/api/current/scala/collection/mutable/ArrayOps.html,我很笨. (2认同)

Key*_*r00 10

想象一下,你有一个包含ato的元素的数组f

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

然后,您可以通过不同方式从中提取子数组:

  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不包括在内.

    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')

参考:官方文件