Функция среза Scala

Сегодня мы рассмотрим функцию среза Scala.

Scala slice

Функция среза Scala доступна в следующих классах API:

Мы рассмотрим каждое API и обсудим их подробно с примерами в следующем разделе.

Использование функции среза Scala

В API Scala функция “slice” используется для выбора интервала элементов. Она принимает два параметра типа “Int” и возвращает подмножество, целое или ни одного элемента из оригинальной коллекции (или строки или массива). Сценарий среза в реальном мире:- Мы также можем использовать эту функцию среза в нашей обычной жизни, как показано ниже. Здесь Bread.slice(0,10) означает взять ломтики хлеба с 0 по 9, всего 10 ломтиков хлеба. (Просто чтобы напомнить функцию среза Scala, здесь я использую ноль, но предположите, что это единица.) Синтаксис функции среза: В стандартной библиотеке Scala (API) эта функция среза определена следующим образом:

  def slice(from-index: Int, until-index: Int): ScalaAPIClass[A]

Здесь “ScalaAPIClass” означает любой класс коллекции Scala (который поддерживает доступ на основе индекса, например, Seq, List и т. д.), классы String, Array. Пример: Следующая функция определена в классе Seq API Scala.

  def slice(from-index: Int, until-index: Int): Seq[A]

Параметры функции среза: Использование параметров функции “slice” описано в следующей таблице:

S.No. Function Params Usage
1. First Parameter Starting index (Inclusive). It should be zero or any any positive integer less than the length of the Collection or String or Array.
2. Second Parameter Ending index (Exclusive).

Функция среза извлекает элементы, начиная с “первого индекса” (включительно) до “индекса до” (исключительно). Здесь номера элементов для массива чисел, символов для строки, объект для коллекции.

Срез массива Scala

В API Scala класс Array определяет функцию среза следующим образом:

def slice(from: Int, until: Int): Array[T]

Вот ‘from’ – это начальный индекс (включительно) массива, а ‘until’ – конечный индекс (исключительно) массива. Примеры функции среза массива:

scala> val marksArray = Array(56,79,60,99,71)
marksArray: Array[Int] = Array(56, 79, 60, 99, 71)

Int массива с 5 значениями создается, поэтому его начальное значение индекса 0, а конечное значение индекса 4. Его длина = 5. Давайте поиграем с функцией среза сейчас.

scala> marksArray.slice(0,2)
res0: Array[Int] = Array(56, 79)

Он начинается с индекса 0, то есть первого элемента, и извлекает все элементы до 2, что означает индекс = 1, поэтому мы получаем 0-й и 1-й элементы здесь.

scala> marksArray.slice(3,4)
res1: Array[Int] = Array(99)

Мы можем получить доступ к любому диапазону индексов.

scala> marksArray.slice(3,3)
res2: Array[Int] = Array()

Если мы укажем одинаковые значения для начала и конца, как в приведенном выше примере, мы получим пустой массив. Почему? Индекс начала = 3, индекс конца = 3 – 1 = 2. Невозможно извлечь набор элементов из массива с 3 по 2 индексы, верно?

scala> marksArray.slice(-1,3)
res3: Array[Int] = Array(56, 79, 60)

Если мы укажем отрицательные значения, он просто начнет с доступного индекса, как показано выше.

scala> marksArray.slice(0,5)

res4: Array[Int] = Array(56, 79, 60, 99, 71)

Если мы укажем значение второго параметра за пределами доступного индекса, как показано выше (максимальное доступное значение индекса в marksArray – 4, так как его длина = 5), он просто игнорирует это значение и возвращает только доступные индексы. Примечание: В отличие от Java, это не вызывает исключение ArrayIndexOutOfBoundsException.

Срез коллекции Scala

В стандартном API Scala большинство классов определяет эту функцию среза, которая поддерживает доступ к элементам на основе индексов. Например, класс List определяет эту функцию, как показано ниже:

def slice(from: Int, until: Int): List[A]

Примеры функции среза списка: То же самое, что и примеры массива, мы получим те же результаты для любого API коллекции.

scala> val list = List(56, 79, 60, 99, 71)
list: List[Int] = List(56, 79, 60, 99, 71)

scala> list.slice(0,2)
res5: List[Int] = List(56, 79)

scala> list.slice(3,4)
res6: List[Int] = List(99)

scala> list.slice(3,3)
res7: List[Int] = List()

scala> list.slice(-1,3)
res8: List[Int] = List(56, 79, 60)

scala> list.slice(0,5)
res9: List[Int] = List(56, 79, 60, 99, 71)

Если мы обратимся к пустому списку, мы получим только пустой список, как показано ниже

scala> val list2 = List()
list2: List[Nothing] = List()

scala> list2.slice(0,1)

res10: List[Nothing] = List()

Срез строки Scala

В API Scala класс “StringOps” определен в пакете scala.collection.immutable. Он определяет функцию среза, показанную ниже:

def slice(from: Int, until: Int): String

ПРИМЕЧАНИЕ:- В Scala мы используем класс String Java. Но у этого класса НЕТ функции среза. Когда мы используем функцию среза для объектов String Java, компилятор Scala внутренне преобразует этот объект String в объект класса StringOps для использования этой функции среза. (Не только функция среза, многое другое. См. API Scala для получения дополнительной информации.) Это означает, что “StringOps” является неявным классом класса String. Примеры функции среза строки:

scala> val str = "Hello I'm doing good. How are you?"
str: String = Hello I'm doing good. How are you?

scala> str.slice(6,9)

res8: String = I'm

Как мы знаем, индекс строки начинается с нуля. Здесь от индекса-начала = 6 означает, что до-индекса = 9 (Это исключение, поэтому нам нужно учитывать только до индекса = 8) Функция подстроки строки работает так же, как ее функция среза, как показано ниже:

scala> str.substring(6,9)
res12: String = I'm

Здесь и str.slice(6,9), и str.substring(6,9) возвращают одно и то же значение. Срез Против Подстроки Разница между функциями среза и подстроки класса String

  • По функциональности и синтаксису нет разницы
  • Производительность практически аналогична и незначительна.

Примечание:- В Scala мы можем получить доступ к символам строки так же, как к элементам массива, как показано ниже:

scala> str(0)
res0: Char = H

Здесь возвращается Char, а не String

scala> str(-1)
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
  at java.lang.String.charAt(String.java:658)
  at scala.collection.immutable.StringOps$.apply$extension(StringOps.scala:38)
  ... 33 elided

scala> str.length
res2: Int = 34

scala> str(34)
java.lang.StringIndexOutOfBoundsException: String index out of range: 34
  at java.lang.String.charAt(String.java:658)
  at scala.collection.immutable.StringOps$.apply$extension(StringOps.scala:38)

  ... 33 elided

Примечание:- Если мы попытаемся получить доступ к символам строки вне диапазона, мы получим StringIndexOutOfBoundsException, как показано выше. Доступ к символам строки возвращает Char, тогда как функции подстроки и среза возвращают String, как показано ниже.

scala> str(0)
res4: Char = H

scala> str.substring(0,1)
res5: String = H

scala> str.slice(0,1)
res6: String = H

Это все, что касается использования “функции среза Scala”. Мы обсудим еще некоторые концепции Scala в моих будущих сообщениях. Ссылка: Scala API Doc

Source:
https://www.digitalocean.com/community/tutorials/scala-slice-function