web-dev-qa-db-ja.com

Scalaでサブアレイを取得する正しい方法は何ですか?

私は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ライブラリを使用するのはいつも少し汚い気分になります。

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
}

しかし、より良い方法はありますか?

86
nnythm

スライスメソッドを呼び出すことができます。

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

Pythonのように動作します。

119
paradigmatic

aからfの要素を持つ配列があるとします

_scala> val array = ('a' to 'f').toArray // Array('a','b','c','d','e','f')
_

その後、さまざまな方法でサブアレイをそこから抽出できます。

  1. drop(n: Int)を使用して最初のn個の最初の要素をドロップする

    array.drop(2) // Array('c','d','e','f')

  2. take(n: Int)で最初のn個の要素を取得します

    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. takeRight(n: Int)で最後のn個の要素を選択します。

    array.takeRight(4) // Array('c','d','e','f')

参照公式ドキュメント

9
KeyMaker00