本日はScalaのスライス関数を見てみましょう。
Scalaのスライス
Scalaのスライス関数は、以下のAPIクラスで利用可能です:
- ScalaのArray API
- String API
- ScalaのCollection API
次のセクションで、各APIを取り上げ、適切な例を用いて詳細に議論します。
Scalaのスライス関数の使用法
Scala APIでは、`slice` 関数は要素の間隔を選択するために使用されます。これは “Int” 型の2つのパラメータを取り、元のコレクション(または文字列や配列)のサブセット、または全体、または要素のないものを返します。実世界のスライスシナリオ:- 私たちは、以下に示すように、このスライス関数を日常生活でも使用することができます。 ここでの Bread.slice(0,10) は、0から9までのパンのスライスを取ることを意味し、合計で10枚のパンのスライスになります。(ここではScalaのスライス関数に似せるためにゼロを使用していますが、これを一として想定してください。)スライス関数の構文: Scala標準ライブラリ(API)では、このスライス関数は以下のように定義されています:
def slice(from-index: Int, until-index: Int): ScalaAPIClass[A]
ここで「ScalaAPIClass」とは、Seq、Listなどのインデックスベースのアクセスをサポートする任意のScalaコレクションクラス、文字列、配列クラスを意味します。例:- 次の関数はScala APIのSeqクラスで定義されています。
def slice(from-index: Int, until-index: Int): Seq[A]
スライス関数のパラメータ: 「スライス」関数パラメータの使用法は、次の表で説明されています:
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). |
スライス関数は「first-index」(包括的)から「until-index」(排他的)までの要素を抽出します。ここで、要素の数は数字の配列、文字列の文字、コレクションのオブジェクトに対応します。
Scala配列スライス
Scala APIでは、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)
値が5つの配列のIntが作成されると、そのインデックスの開始値は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)
利用可能なインデックスを超えた2番目のパラメータ値を指定すると(marksArrayでの利用可能な最大インデックス値は5で、長さ = 5)、その値を無視して利用可能なインデックスまでの値を返します。注意:-Javaとは異なり、ArrayIndexOutOfBoundsExceptionをスローしません。
Scalaコレクションスライス
Scalaの標準APIでは、ほとんどのクラスがこのスライス関数を定義しており、インデックスベースの要素アクセスをサポートしています。 たとえば、Listクラスは以下に示すようにこの関数を定義しています:
def slice(from: Int, until: Int): List[A]
リストのスライスの関数の例:- 配列の例と同様に、任意のCollection 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の文字列スライス
Scala APIでは、”StringOps”クラスがscala.collection.immutableパッケージに定義されています。次に、スライス関数が以下に示すように定義されています:
def slice(from: Int, until: Int): String
注意:- Scalaでは、JavaのStringクラスを使用します。ただし、このクラスにはスライス関数がありません。 JavaのStringオブジェクトでスライス関数を使用すると、ScalaコンパイラはこのStringオブジェクトをStringOpsクラスオブジェクトに内部的に変換してこのスライス関数を使用します。 (スライス関数だけでなく、詳細についてはScala APIを参照してください。)つまり、「StringOps」はStringクラスの暗黙のクラスです。 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
わかっているように、Stringのインデックスはゼロから始まります。ここでは、from-index = 6はuntil-index = 9(排他的なのでindex = 8まで考慮する必要があります)Stringのsubstring関数は、以下に示すように、そのスライス関数と同じくらい動作します:
scala> str.substring(6,9)
res12: String = I'm
ここでは、str.slice(6,9)とstr.substring(6,9)の両方が同じ値を返しています。スライス対サブストリング Stringクラスのスライスとsubstring関数の違い
- 機能的にも構文的にも違いはありません。
- パフォーマンスはほぼ同じで、無視できます。
注意:- Scalaでは、以下に示すように、Stringの文字にアクセスすることができます:
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を返し、substringおよびslice関数は以下に示すようにStringを返します。
scala> str(0)
res4: Char = H
scala> str.substring(0,1)
res5: String = H
scala> str.slice(0,1)
res6: String = H
これで「Scalaのslice関数」の使用に関するすべてです。今後の投稿でさらにScalaの概念について議論します。参照:Scala API Doc
Source:
https://www.digitalocean.com/community/tutorials/scala-slice-function