Scalaでサブ配列を取得する正しい方法は何ですか?


94

私は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ライブラリを使用することは、いつも少し汚れているように感じます。私がそれをするために見つけた最も「スケーラブルな」方法は

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
}

しかし、もっと良い方法はありますか?

回答:


129

あなたはスライスメソッドを呼び出すことができます:

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

Pythonのように動作します。


2
もちろん、ArrayOpsscala-lang.org / api / current /scala / collection / mutable / 、私はばかげています。
nnythm

はい、あなたが正しい。私は拘束力のある慣習について言及していました。下限は含まれ、上限は除外されます。末尾:もありません。
パラダイム

13

から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. 最後のn個の要素をdropRight(n: Int)次のように除外します:

    array.dropRight(4) // Array('a','b')

  5. 最後のn個の要素を選択しtakeRight(n: Int)ます。

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

参照公式ドキュメント


0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.