105

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

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

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

最明显的方法是使用 Java Arrays util library。

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

但是在 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
}

但是有更好的方法吗?

4

3 回答 3

141

您可以调用切片方法:

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

它就像在 python 中一样工作。

于 2012-05-31T09:36:04.660 回答
16

想象一下,您有一个数组,其中包含从ato的元素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排除在外。

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

    slice 方法严格等价于:
    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')

参考官方文档

于 2018-08-10T18:24:07.947 回答
1

从 2D Scala 数组 (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
于 2020-06-16T14:10:58.597 回答