Hoy examinaremos la función de segmentación de Scala.
Scala slice
La función de segmentación en Scala está disponible en las siguientes clases de API:
- Scala Array API
- String API
- Scala Collection API
Seleccionaremos cada API y las analizaremos en profundidad con ejemplos adecuados en la siguiente sección.
Uso de la función de segmentación en Scala
En la API de Scala, la función ‘slice’ se utiliza para seleccionar un intervalo de elementos. Toma dos parámetros de tipo “Int” y devuelve un subconjunto o todo o ningún elemento de la Colección original (o String o Array). Escenario de corte del mundo real:- También podemos usar esta función de corte en nuestra vida real regular como se muestra a continuación. Aquí, Bread.slice(0,10) significa tomar rebanadas de pan del 0 al 9, así que en total 10 rebanadas de pan. (Solo para hacer referencia a la función de corte de Scala aquí estoy usando cero, pero suponga esto como uno). Sintaxis de la función de corte: En la Biblioteca Estándar de Scala (API), esta función de corte se define de la siguiente manera:
def slice(from-index: Int, until-index: Int): ScalaAPIClass[A]
Aquí “ScalaAPIClass” significa cualquier clase de Colección de Scala (que admite acceso basado en índices como Seq, List, etc.), clases String, Array. Ejemplo:- La siguiente función está definida en la clase Seq de la API de Scala.
def slice(from-index: Int, until-index: Int): Seq[A]
Parámetros de la función de corte: El uso de los parámetros de la función “slice” se describe en la siguiente tabla:
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). |
La función de corte extrae elementos que comienzan desde el ‘primer índice’ (inclusive) hasta el ‘hasta índice’ (exclusivo). Aquí, números de elementos para un Array de Números, Caracteres para un String, un objeto para una Colección.
Corte de Array de Scala
En la API de Scala, la clase Array define la función de corte de la siguiente manera:
def slice(from: Int, until: Int): Array[T]
Aquí, ‘from’ es el índice de inicio (Inclusivo) del array y ‘until’ es el índice de finalización (Exclusivo) del array. Ejemplos de la Función de Corte de Array:
scala> val marksArray = Array(56,79,60,99,71)
marksArray: Array[Int] = Array(56, 79, 60, 99, 71)
Se crea un array de tipo entero con 5 valores, por lo que su valor de inicio de índice es 0 y el valor de fin de índice es 4. Su longitud es 5. Ahora, juguemos con la función de corte.
scala> marksArray.slice(0,2)
res0: Array[Int] = Array(56, 79)
Comienza con el índice 0, que es el primer elemento, y recupera todos los elementos hasta el 2, es decir, el índice 1, por eso obtenemos el elemento 0 y el elemento 1 aquí.
scala> marksArray.slice(3,4)
res1: Array[Int] = Array(99)
Podemos acceder a cualquier rango de índices.
scala> marksArray.slice(3,3)
res2: Array[Int] = Array()
Si damos los mismos valores para el inicio y el fin como arriba, obtendremos un array vacío, ¿por qué? Índice de inicio = 3, Índice de fin = 3 – 1 = 2. No es posible recuperar un conjunto de elementos de un array desde el índice 3 hasta el 2, ¿verdad?
scala> marksArray.slice(-1,3)
res3: Array[Int] = Array(56, 79, 60)
Si damos valores negativos, simplemente comienza con el índice disponible, como se muestra arriba.
scala> marksArray.slice(0,5)
res4: Array[Int] = Array(56, 79, 60, 99, 71)
Si damos un valor en el segundo parámetro más allá de su índice disponible, como se muestra arriba (el valor máximo de índice disponible en marksArray es 4, ya que su longitud es 5), simplemente ignora ese valor y devuelve hasta el índice disponible únicamente. NOTA: A diferencia de Java, no arroja ninguna ArrayIndexOutOfBoundsException.
Corte de la colección Scala
En la API estándar de Scala, la mayoría de las clases definen esta función de corte que admite el acceso a elementos basado en índices. Por ejemplo, la clase List define esta función como se muestra a continuación:
def slice(from: Int, until: Int): List[A]
Ejemplos de la función de corte de lista:- Al igual que los ejemplos de matrices, obtendremos los mismos resultados para cualquier API de colección.
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)
Si accedemos a una lista vacía, obtendremos una lista vacía como se muestra a continuación
scala> val list2 = List()
list2: List[Nothing] = List()
scala> list2.slice(0,1)
res10: List[Nothing] = List()
Corte de cadena en Scala
En la API de Scala, la clase “StringOps” está definida en el paquete scala.collection.immutable. Define la función de corte como se muestra a continuación:
def slice(from: Int, until: Int): String
NOTA:- En Scala, usamos la clase String de Java. Pero esta clase NO tiene la función de corte. Cuando usamos la función de corte en objetos String de Java, el compilador de Scala convierte internamente este objeto String en un objeto de clase StringOps para usar esta función de corte. (No solo la función de corte, consulte la API de Scala para obtener más información). Es decir, “StringOps” es una clase implícita de la clase String. Ejemplos de la función de corte de cadena:-
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
Como sabemos, el índice de la cadena comienza con cero. Aquí, from-index = 6 significa until-index = 9 (es exclusivo, así que debemos considerar hasta el índice = 8 solamente). La función de subcadena de la cadena funciona igual que su función de corte, como se muestra a continuación:
scala> str.substring(6,9)
res12: String = I'm
Aquí tanto str.slice(6,9) como str.substring(6,9) devuelven el mismo valor. Corte Vs subcadena Diferencia entre las funciones de corte y subcadena de la clase String
- En cuanto a la funcionalidad y la sintaxis, no hay diferencia
- El rendimiento es casi similar y despreciable.
NOTA:- En Scala, podemos acceder a los caracteres de una cadena de la misma manera que a los elementos de un arreglo, como se muestra a continuación:
scala> str(0)
res0: Char = H
Aquí devuelve un Char, pero no una cadena
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
NOTA:- Si intentamos acceder a los caracteres de una cadena fuera del rango, obtenemos StringIndexOutOfBoundsException como se muestra arriba. El acceso a los caracteres de la cadena devuelve un Char, mientras que las funciones de subcadena y corte devuelven una cadena, como se muestra a continuación.
scala> str(0)
res4: Char = H
scala> str.substring(0,1)
res5: String = H
scala> str.slice(0,1)
res6: String = H
Eso es todo acerca del uso de la función “slice” en Scala. Discutiremos algunos conceptos más de Scala en mis próximas publicaciones. Referencia: Documentación de la API de Scala
Source:
https://www.digitalocean.com/community/tutorials/scala-slice-function