Який правильний спосіб отримати підрив у Scala?


94

Я намагаюся отримати підрядок в масштабі, і я трохи розгублений у тому, що це правильний спосіб. Мені б найбільше хотілося б щось подібне, як це можна зробити в 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
}

але чи є кращий спосіб?

Відповіді:


130

Ви можете викликати метод зрізу:

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

Це працює як у python.


2
о, звичайно, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , я німий.
nnythm

Так, ви праві. Я мав на увазі зв'язані конвенції. Нижня межа включається, а верхня виключається. Немає жодного кінця :.
парадигматичний

13

Уявіть, у вас є масив з елементами від aдоf

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

Тоді ви можете витягнути з нього підмасив різними способами:

  1. Випадання перших п перших елементів с 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. Виберіть останні п елементів за допомогою takeRight(n: Int):

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

Довідка : Офіційна документація


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.