我正在尝试在scala中获得一个子数组,并且我对这样做的正确方法感到有些困惑。我最想要的就是你如何在python中做到这一点:
x = [3, 2, 1]
x[0:2]
但我相当肯定你不能这样做。
最明显的方法是使用Java Arrays util库。
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
}
但有更好的方法吗?
答案 0 :(得分:117)
您可以调用切片方法:
scala> Array("foo", "hoo", "goo", "ioo", "joo").slice(1, 4)
res6: Array[java.lang.String] = Array(hoo, goo, ioo)
就像在python中一样。
答案 1 :(得分:6)
想象一下,您有一个数组,其元素从a
到f
scala> val array = ('a' to 'f').toArray // Array('a','b','c','d','e','f')
然后您可以通过不同的方式从其中提取子数组:
使用drop(n: Int)
array.drop(2) // Array('c','d','e','f')
使用take(n: Int)
array.take(4) // Array('a','b','c','d')
使用slice(from: Int, until: Int)
选择元素的任何间隔。请注意,until
被排除在外。
array.slice(2,4) // Array('c','d')
slice方法严格等效于:
array.take(4).drop(2) // Array('c','d')
用dropRight(n: Int)
排除最后n个元素:
array.dropRight(4) // Array('a','b')
使用takeRight(n: Int)
选择最后n个元素:
array.takeRight(4) // Array('c','d','e','f')
答案 2 :(得分: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