Funzione di slice di Scala

Oggi parleremo della funzione di taglio di Scala.

Scala slice

La funzione di taglio di Scala è disponibile nelle seguenti classi di API:

Esamineremo ciascuna API e le discuteremo approfonditamente con esempi appropriati nella sezione successiva.

Utilizzo della funzione di taglio di Scala

Nell’API di Scala, la funzione ‘slice’ viene utilizzata per selezionare un intervallo di elementi. Prende due parametri di tipo “Int” e restituisce un sottoinsieme o l’intero o nessun elemento dell’originale Collezione (o Stringa o Array). Scenario di slice del mondo reale:- Possiamo utilizzare questa funzione slice anche nella nostra vita quotidiana come mostrato di seguito. Qui Bread.slice(0,10) significa prendere fette di pane da 0 a 9 quindi un totale di 10 fette di pane. (Solo per assomigliare alla funzione slice di Scala qui sto usando zero, ma assumi che sia uno.) Sintassi della funzione slice: Nella Libreria Standard di Scala (API), questa funzione slice è definita come segue:

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

Qui “ScalaAPIClass” significa qualsiasi classe di Collezione Scala (che supporta l’accesso basato su indice come Seq, List, ecc.), classi Stringa, Array. Esempio:- La seguente funzione è definita nella classe Seq dell’API di Scala.

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

Parametri della funzione slice: L’uso dei parametri della funzione “slice” è descritto nella tabella seguente:

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 funzione slice estrae gli elementi a partire dall’indice ‘primo-indice’ (incluso) fino all’indice ‘fino-indice’ (escluso). Qui i numeri degli elementi per un Array di Numeri, Caratteri per una Stringa, un oggetto per una Collezione.

Taglio di Array Scala

Nell’API di Scala, la classe Array definisce la funzione slice come segue:

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

Ecco, ‘from’ è l’indice di partenza (inclusivo) dell’Array e ‘until’ è l’indice di fine (esclusivo) dell’Array. Esempi di funzione di taglio dell’array:

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

Int di Array con 5 valori sono creati quindi il valore di inizio dell’indice è 0 e il valore di fine dell’indice è 4. La sua lunghezza = 5 Giochiamo ora con la funzione di taglio.

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

Parte dall’indice 0 che è il primo elemento e recupera tutti gli elementi fino a 2 significa indice = 1 ecco perché abbiamo ottenuto l’elemento 0 e l’elemento 1 qui.

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

Possiamo accedere con qualsiasi intervallo di indici.

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

Se diamo gli stessi valori per inizio e fine come sopra otterremo un array vuoto perché? Indice di inizio = 3 Indice di fine = 3 – 1 = 2 Non è possibile recuperare un insieme di elementi da un array da 3 a 2 indici giusto.

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

Se diamo valori negativi, inizia semplicemente con l’indice disponibile come mostrato sopra.

scala> marksArray.slice(0,5)

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

Se diamo un valore di secondo parametro oltre l’indice disponibile come mostrato sopra (Indice massimo disponibile in marksArray è solo 4 poiché la sua lunghezza = 5), semplicemente ignora quel valore e restituisce fino all’indice disponibile solo. NOTA:- A differenza di Java, non genera alcuna ArrayIndexOutOfBoundsException.

Taglio della collezione di Scala

Nell’API Standard di Scala, la maggior parte delle classi definisce questa funzione di taglio che supporta l’accesso agli elementi basato su indici. Ad esempio, la classe List definisce questa funzione come mostrato di seguito:

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

Esempi di funzione di slicing della lista:- Stessi esempi degli array, otterremo gli stessi risultati per qualsiasi API di raccolta.

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)

Se accediamo a una lista vuota, otterremo solo una lista vuota come mostrato di seguito

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

scala> list2.slice(0,1)

res10: List[Nothing] = List()

Scala String slice

Nell’API di Scala, la classe “StringOps” è definita nel pacchetto scala.collection.immutable. Definisce la funzione di slicing come mostrato di seguito:

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

NOTA:- In Scala, utilizziamo la classe String di Java. Ma questa classe NON ha una funzione di slicing. Quando utilizziamo la funzione di slicing sugli oggetti String di Java, il compilatore di Scala converte internamente questo oggetto String in un oggetto di classe StringOps per utilizzare questa funzione di slicing. (Non solo la funzione di slicing, molte altre. Vedere l’API di Scala per ulteriori informazioni.) Ciò significa che “StringOps” è una classe implicita della classe String. Esempi di funzione di slicing di 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

Come sappiamo, l’indice della stringa inizia con zero. Qui from-index = 6 significa until-index = 9 (È esclusivo quindi dobbiamo considerare fino all’indice = 8 solo) La funzione di substring della stringa funziona allo stesso modo della sua funzione di slicing come mostrato di seguito:

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

Qui sia str.slice(6,9) che str.substring(6,9) restituiscono lo stesso valore. slice Vs substring Differenza tra le funzioni di slicing e di substring della classe String

  • A livello di funzionalità e sintassi non c’è differenza
  • Le prestazioni sono quasi simili e trascurabili.

NOTA:- In Scala, possiamo accedere ai caratteri della stringa proprio come agli elementi di un array, come mostrato di seguito:

scala> str(0)
res0: Char = H

Qui restituisce un carattere, non una stringa

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:- Se proviamo ad accedere ai caratteri della stringa fuori dall’intervallo, otteniamo StringIndexOutOfBoundsException come mostrato sopra. L’accesso ai caratteri della stringa restituisce un carattere, mentre le funzioni di sottostringa e slice restituiscono una stringa, come mostrato di seguito.

scala> str(0)
res4: Char = H

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

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

Ecco tutto sulla funzione di “slice” di Scala. Discuteremo altri concetti di Scala nei miei prossimi articoli. Riferimento: Documentazione API di Scala

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