Bagaimana cara yang benar untuk mendapatkan subarray di Scala?

95

Saya mencoba untuk mendapatkan subarray dalam skala, dan saya sedikit bingung tentang cara yang tepat untuk melakukannya. Yang paling saya inginkan adalah sesuatu seperti bagaimana Anda bisa melakukannya dengan python:

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

tetapi saya cukup yakin Anda tidak dapat melakukan ini.

Cara paling jelas untuk melakukannya adalah dengan menggunakan pustaka util Java Array.

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

Tapi selalu membuat saya merasa sedikit kotor menggunakan perpustakaan Java di Scala. Cara paling "scalaic" yang saya temukan untuk melakukannya adalah

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
}

tetapi apakah ada cara yang lebih baik?

nnythm
sumber

Jawaban:

131

Anda dapat memanggil metode slice:

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

Ia bekerja seperti di python.

paradigmatis
sumber
3
oh, tentu saja, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , saya bodoh.
nnythm
Ya kau benar. Saya mengacu pada konvensi terikat. Batas bawah disertakan dan bagian atas dikecualikan. Tidak ada yang tertinggal :juga.
paradigmatik
@nnythm Tautannya adalah kepala.
Amir A. Shabani
14

Bayangkan Anda memiliki array dengan elemen dari ahinggaf

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

Kemudian Anda dapat mengekstrak sub-larik darinya dengan berbagai cara:

  1. Menjatuhkan n elemen pertama dengan drop(n: Int)

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

  2. Ambil n elemen pertama dengan take(n: Int)

    array.take(4) // Array('a','b','c','d')

  3. Pilih setiap interval elemen dengan slice(from: Int, until: Int). Catatan yang untildikecualikan.

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

    Metode slice sama persis dengan:
    array.take(4).drop(2) // Array('c','d')

  4. Kecualikan n elemen terakhir dengan dropRight(n: Int):

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

  5. Pilih n elemen terakhir dengan takeRight(n: Int):

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

Referensi : Dokumentasi resmi

Pembuat kunci00
sumber
1

Contoh mengekstrak kolom tertentu dari 2D Scala Array (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
Athanasios Tsiaras
sumber