105

私は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)

しかし、ScalaでJavaライブラリを使用するのはいつも少し汚い気がします。私がそれをするために見つけた最も「鱗状の」方法は

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

aからまでの要素を持つ配列があると想像してください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')

    スライスメソッドは、厳密に次と同等です。
    array.take(4).drop(2) // Array('c','d')

  4. dropRight(n: Int)最後のn個の要素を:で除外します

    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 に答える