Как правильно получить подмассив в Scala?

96

Я пытаюсь получить подмассив в 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 всегда заставляет меня чувствовать себя немного грязно. Самый "скалайский" способ, который я нашел для этого, был бы

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
}

но есть ли способ лучше?

nnythm
источник

Ответы:

133

Вы можете вызвать метод среза:

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

Работает как в питоне.

парадигматический
источник
3
о, конечно, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , я тупой.
nnythm
Да, ты прав. Я имел в виду связанные соглашения. Нижняя граница включена, а верхняя исключена. Трейлинга тоже :нет.
paradigmatic
@nnythm Ссылка голова.
Амир А. Шабани,
Похоже, я не могу отредактировать устаревший комментарий, но живая ссылка: 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')

Ссылка : Официальная документация

KeyMaker00
источник
1

Пример извлечения определенных столбцов из массива 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
Афанасиос Циарас
источник