วิธีที่ถูกต้องในการรับ subarray ใน Scala คืออะไร?


97

ฉันกำลังพยายามหา subarray ใน scala และฉันสับสนเล็กน้อยว่าวิธีที่เหมาะสมในการทำคืออะไร สิ่งที่ฉันต้องการมากที่สุดคือสิ่งที่คุณสามารถทำได้ใน python:

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

แต่ฉันค่อนข้างมั่นใจว่าคุณไม่สามารถทำได้

วิธีที่ชัดเจนที่สุดคือการใช้ไลบรารียูทิลิตี้ Java Arrays

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

แต่มันทำให้ฉันรู้สึกสกปรกเล็กน้อยที่ใช้ไลบรารี Java ใน Scala วิธีที่ "scalaic" มากที่สุดที่ฉันพบจะเป็น

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
}

แต่มีวิธีที่ดีกว่านี้ไหม

คำตอบ:


134

คุณสามารถเรียกวิธีการสไลซ์:

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

มันทำงานเหมือนใน python


3
โอ้แน่นอน ArrayOps scala-lang.org/api/current/scala/collection/mutable/…ฉันโง่
nnythm

ใช่คุณพูดถูก. ฉันกำลังอ้างถึงอนุสัญญาที่ผูกมัด ขอบเขตล่างรวมอยู่และไม่รวมส่วนบน ไม่มีการต่อท้าย:ไม่มี
paradigmatic

@nnythm ลิงค์อยู่หัว.
Amir A. Shabani

ดูเหมือนว่าจะแก้ไขความคิดเห็นที่ค้างไม่ได้ แต่ลิงก์ที่ยังมีชีวิตอยู่คือscala-lang.org/api/2.12.8/scala/collection/mutable/…
nnythm

15

ลองนึกภาพคุณมีอาร์เรย์ที่มีองค์ประกอบจาก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')

อ้างอิง : เอกสารอย่างเป็นทางการ


1

ตัวอย่างของการแยกคอลัมน์เฉพาะจาก 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.