Jaki jest prawidłowy sposób uzyskania podtablicy w Scali?

96

Próbuję uzyskać podtablicę w scali i jestem trochę zdezorientowany, jaki jest właściwy sposób wykonania tego. To, co chciałbym najbardziej, to coś takiego, jak możesz to zrobić w Pythonie:

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

ale jestem całkiem pewien, że nie możesz tego zrobić.

Najbardziej oczywistym sposobem byłoby użycie biblioteki util języka Java Arrays.

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

Ale zawsze czuję się trochę brudny, gdy korzystam z bibliotek Java w Scali. Najbardziej „szalony” sposób, jaki znalazłem na to, byłby

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
}

ale czy jest lepszy sposób?

nnythm
źródło

Odpowiedzi:

133

Możesz wywołać metodę wycinka:

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

Działa jak w Pythonie.

paradygmatyczny
źródło
3
och, oczywiście, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , jestem głupi.
nnythm
Tak, masz rację. Miałem na myśli sztywne konwencje. Dolna granica jest uwzględniona, a górna jest wykluczona. Nie ma też końca :.
paradygmatyczny
@nnythm Link to głowa.
Amir A. Shabani
Wygląda na to, że nie mogę edytować komentarza tak nieaktualnego, ale żywy link to: scala-lang.org/api/2.12.8/scala/collection/mutable/…
nnythm
15

Wyobraź sobie, że masz tablicę z elementami od adof

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

Następnie możesz wyodrębnić z niej podtablicę na różne sposoby:

  1. Porzucenie pierwszych n pierwszych elementów za pomocą drop(n: Int)

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

  2. Weź pierwsze n elementów za pomocą take(n: Int)

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

  3. Wybierz dowolny przedział elementów za pomocą slice(from: Int, until: Int). Zauważ, że untiljest to wykluczone.

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

    Metoda wycinków jest ściśle równoważna z:
    array.take(4).drop(2) // Array('c','d')

  4. Wyklucz ostatnie n elementów za pomocą dropRight(n: Int):

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

  5. Wybierz ostatnie n elementów za pomocą takeRight(n: Int):

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

Odniesienie : Oficjalna dokumentacja

KeyMaker00
źródło
1

Przykład wyodrębniania określonych kolumn z tablicy 2D Scala (tablica_oryginalna):

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
źródło