Cách chính xác để có được một mảng con trong Scala là gì?


94

Tôi đang cố gắng lấy một mảng con trong scala, và tôi hơi bối rối về cách thực hiện thích hợp. Điều tôi muốn nhất sẽ là một cái gì đó như cách bạn có thể làm điều đó trong python:

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

nhưng tôi khá chắc chắn rằng bạn không thể làm điều này.

Cách rõ ràng nhất để làm điều đó là sử dụng thư viện Java Arrays.

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

Nhưng nó luôn khiến tôi cảm thấy hơi bẩn khi sử dụng các thư viện Java trong Scala. Cách "quy mô nhỏ" nhất mà tôi thấy để làm điều đó sẽ là

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
}

nhưng có cách nào tốt hơn không?

Câu trả lời:


129

Bạn có thể gọi phương thức lát cắt:

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

Nó hoạt động giống như trong python.


2
Ồ, tất nhiên, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , tôi chết lặng.
nnythm,

Vâng bạn đã đúng. Tôi đang đề cập đến các quy ước ràng buộc. Giới hạn dưới được bao gồm và giới hạn trên bị loại trừ. Không có dấu vết :cũng không.
paradigmatic

13

Hãy tưởng tượng bạn có một mảng với các phần tử từ ađếnf

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

Sau đó, bạn có thể trích xuất một mảng con từ nó theo các cách khác nhau:

  1. Bỏ n phần tử đầu tiên với drop(n: Int)

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

  2. Lấy n phần tử đầu tiên với take(n: Int)

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

  3. Chọn bất kỳ khoảng nào của các phần tử với slice(from: Int, until: Int). Lưu ý rằng untilbị loại trừ.

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

    Phương pháp lát cắt tương đương với:
    array.take(4).drop(2) // Array('c','d')

  4. Loại trừ n phần tử cuối cùng với dropRight(n: Int):

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

  5. Chọn n phần tử cuối cùng với takeRight(n: Int):

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

Tham khảo : Tài liệu chính thức


0

Ví dụ về cách trích xuất các cột cụ thể từ Mảng Scala 2D (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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.