Scala-lists

提供:Dev Guides
移動先:案内検索

Scala-リスト

Scalaリストは配列に非常に似ています。つまり、リストのすべての要素は同じ型を持ちますが、2つの重要な違いがあります。 まず、リストは不変です。つまり、リストの要素は割り当てによって変更できません。 第二に、リストはリンクリストを表しますが、配列はフラットです。

タイプTの要素を持つリストのタイプは、 List [T] と記述されます。

次の例を試してください。さまざまなデータ型に対して定義されたいくつかのリストがあります。

//List of Strings
val fruit: List[String] = List("apples", "oranges", "pears")

//List of Integers
val nums: List[Int] = List(1, 2, 3, 4)

//Empty List.
val empty: List[Nothing] = List()

//Two dimensional list
val dim: List[List[Int]] =
   List(
      List(1, 0, 0),
      List(0, 1, 0),
      List(0, 0, 1)
   )

すべてのリストは、テール Nil と* cons:と発音される :: という2つの基本的な構成要素を使用して定義できます。 Nilは空のリストも表します。 上記のリストはすべて、次のように定義できます。

//List of Strings
val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))

//List of Integers
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))

//Empty List.
val empty = Nil

//Two dimensional list
val dim = (1 :: (0 :: (0 :: Nil))) ::
          (0 :: (1 :: (0 :: Nil))) ::
          (0 :: (0 :: (1 :: Nil))) :: Nil

リストの基本操作

リストに対するすべての操作は、次の3つの方法で表現できます。

Sr.No Methods & Description
1

head

このメソッドは、リストの最初の要素を返します。

2

tail

このメソッドは、最初の要素を除くすべての要素で構成されるリストを返します。

3

isEmpty

このメソッドは、リストが空の場合はtrueを返し、そうでない場合はfalseを返します。

次の例は、上記の方法の使用方法を示しています。

object Demo {
   def main(args: Array[String]) {
      val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
      val nums = Nil

      println( "Head of fruit : " + fruit.head )
      println( "Tail of fruit : " + fruit.tail )
      println( "Check if fruit is empty : " + fruit.isEmpty )
      println( "Check if nums is empty : " + nums.isEmpty )
   }
}

上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

Head of fruit : apples
Tail of fruit : List(oranges, pears)
Check if fruit is empty : false
Check if nums is empty : true

リストの連結

*:::* 演算子または* List。:::()*メソッドまたは* List.concat()*メソッドを使用して、2つ以上のリストを追加できます。 以下に示す次の例を見つけてください-

object Demo {
   def main(args: Array[String]) {
      val fruit1 = "apples" :: ("oranges" :: ("pears" :: Nil))
      val fruit2 = "mangoes" :: ("banana" :: Nil)

     //use two or more lists with ::: operator
      var fruit = fruit1 ::: fruit2
      println( "fruit1 ::: fruit2 : " + fruit )

     //use two lists with Set.:::() method
      fruit = fruit1.:::(fruit2)
      println( "fruit1.:::(fruit2) : " + fruit )

     //pass two or more lists as arguments
      fruit = List.concat(fruit1, fruit2)
      println( "List.concat(fruit1, fruit2) : " + fruit  )
   }
}

上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

fruit1 ::: fruit2 : List(apples, oranges, pears, mangoes, banana)
fruit1.:::(fruit2) : List(mangoes, banana, apples, oranges, pears)
List.concat(fruit1, fruit2) : List(apples, oranges, pears, mangoes, banana)

統一リストの作成

  • List.fill()*メソッドを使用すると、同じ要素のゼロ個以上のコピーで構成されるリストを作成できます。 次のプログラム例を試してください。

object Demo {
   def main(args: Array[String]) {
      val fruit = List.fill(3)("apples")//Repeats apples three times.
      println( "fruit : " + fruit  )

      val num = List.fill(10)(2)        //Repeats 2, 10 times.
      println( "num : " + num  )
   }
}

上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

fruit : List(apples, apples, apples)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)

関数の集計

  • List.tabulate()*メソッドとともに関数を使用して、リストを集計する前にリストのすべての要素に適用できます。 引数はList.fillの引数と同じです。最初の引数リストは作成するリストの次元を提供し、2番目のリストはリストの要素を説明します。 唯一の違いは、要素が固定される代わりに、関数から計算されることです。

次のプログラム例を試してください。

object Demo {
   def main(args: Array[String]) {
     //Creates 5 elements using the given function.
      val squares = List.tabulate(6)(n => n *n)
      println( "squares : " + squares  )

      val mul = List.tabulate( 4,5 )( _* _ )
      println( "mul : " + mul  )
   }
}

上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

squares : List(0, 1, 4, 9, 16, 25)
mul : List(List(0, 0, 0, 0, 0), List(0, 1, 2, 3, 4),
   List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))

リストの逆順

*List.reverse* メソッドを使用して、リストのすべての要素を反転できます。 次の例は使用法を示しています。

object Demo {
   def main(args: Array[String]) {
      val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))

      println( "Before reverse fruit : " + fruit )
      println( "After reverse fruit : " + fruit.reverse )
   }
}

上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

Before reverse fruit : List(apples, oranges, pears)
After reverse fruit : List(pears, oranges, apples)

Scalaリストメソッド

以下は、リストで遊んでいるときに使用できる重要な方法です。 利用可能なメソッドの完全なリストについては、Scalaの公式ドキュメントを確認してください。

シニア

説明付きのメソッド

1

*def+(elem:A):リスト[A]*

このリストに要素を追加します

2

*def::( x:A):リスト[A]*

このリストの先頭に要素を追加します。

3

*def
:( prefix:List [A]):List [A]*

指定されたリストの要素をこのリストの前に追加します。

4

*def::( x:A):リスト[A]*

リストの先頭に要素xを追加します

5

*def addString(b:StringBuilder):StringBuilder*

リストのすべての要素を文字列ビルダーに追加します。

6

*def addString(b:StringBuilder、sep:String):StringBuilder*

区切り文字列を使用して、リストのすべての要素を文字列ビルダーに追加します。

7

*def apply(n:Int):A*

リスト内のインデックスによって要素を選択します。

8

  • def contains(elem:Any):ブール*

リストに指定された値が要素として含まれているかどうかをテストします。

9

  • def copyToArray(xs:Array [A]、start:Int、len:Int):ユニット*

リストの要素を配列にコピーします。 指定された配列xsを、このリストのstart以下の長さ(len)の要素で埋めます。

10

*def distinct:リスト[A]*

重複する要素なしでリストから新しいリストを作成します。

11

*def drop(n:Int):リスト[A]*

最初のn個を除くすべての要素を返します。

12

*def dropRight(n:Int):リスト[A]*

最後のn個を除くすべての要素を返します。

13

*def dropWhile(p:(A)=> Boolean):List [A]*

述語を満たす要素の最長のプレフィックスを削除します。

14

  • def endsWith [B](that:Seq [B]):ブール値*

リストが指定されたシーケンスで終了するかどうかをテストします。

15

  • def equals(that:Any):ブール値*

任意のシーケンスのequalsメソッド。 このシーケンスを他のオブジェクトと比較します。

16

  • def exists(p:(A)⇒ Boolean):ブール*

リストのいくつかの要素について述語が成り立つかどうかをテストします。

17

*def filter(p:(A)=> Boolean):List [A]*

述語を満たすリストのすべての要素を返します。

18

  • def forall(p:(A)⇒ Boolean):ブール*

リストのすべての要素について述語が成り立つかどうかをテストします。

19

  • def foreach(f:(A)⇒単位):単位*

リストのすべての要素に関数fを適用します。

20

  • 定義ヘッド:A *

リストの最初の要素を選択します。

21

*def indexOf(elem:A、from:Int):Int*

リスト内で、インデックス位置の後の最初の出現値のインデックスを検索します。

22

*def init:List [A]*

最後を除くすべての要素を返します。

23

*def intersection(that:Seq [A]):リスト[A]*

リストと別のシーケンス間のマルチセット交差を計算します。

24

  • def isEmpty:ブール*

リストが空かどうかをテストします。

25

*def iterator:Iterator [A]*

反復可能オブジェクトに含まれるすべての要素に対して新しい反復子を作成します。

26

*def last:A*

最後の要素を返します。

27

*def lastIndexOf(elem:A、end:Int):Int*

リスト内の値の最後の出現のインデックスを検索します。指定された終了インデックスの前または位置。

28

*def length:Int*

リストの長さを返します。

29

*def map [B](f:(A)=> B):リスト[B]*

このリストのすべての要素に関数を適用することにより、新しいコレクションを構築します。

30

*def max:A*

最大の要素を見つけます。

31

*def min:A*

最小の要素を見つけます。

32

  • def mkString:文字列*

リストのすべての要素を文字列で表示します。

33

  • def mkString(sep:String):文字列*

区切り文字列を使用して、文字列内のリストのすべての要素を表示します。

34

*def reverse:List [A]*

要素を逆順にした新しいリストを返します。

35

*defソート[B>:A]:リスト[A]*

順序に従ってリストを並べ替えます。

36

  • def startsWith [B](that:Seq [B]、offset:Int):ブール値*

リストの特定のインデックスに特定のシーケンスが含まれているかどうかをテストします。

37

*def sum:A*

このコレクションの要素を合計します。

38

*def tail:リスト[A]*

最初を除くすべての要素を返します。

39

*def take(n:Int):リスト[A]*

最初の「n」個の要素を返します。

40

*def takeRight(n:Int):リスト[A]*

最後の「n」要素を返します。

41

*def toArray:Array [A]*

リストを配列に変換します。

42

*def toBuffer [B>:A]:バッファー[B]*

リストを可変バッファーに変換します。

43

*def toMap [T、U]:マップ[T、U]*

このリストをマップに変換します。

44

*def toSeq:Seq [A]*

リストをシーケンスに変換します。

45

*def toSet [B>:A]:Set [B]*

リストをセットに変換します。

46

  • def toString():文字列*

リストを文字列に変換します。