■ はじめに
https://dk521123.hatenablog.com/entry/2023/03/10/193805
https://dk521123.hatenablog.com/entry/2023/03/12/184331
の続き。 今回は、配列やコレクションについて扱う。
試す環境
https://scastie.scala-lang.org/CEpZy3v4Taa0MCStp3LCYg
目次
【1】共通事項 1)使用上の注意 【2】コレクションに関する演算子 1):+演算子 2)+:演算子 / ::演算子 3)++演算子 / :::演算子 【3】配列 - Array 【4】リスト - Seq 【5】集合 - Set 【6】キーバリュー - Map 【7】タプル - Tuple
【0】共通事項
1)使用上の注意
* 可変 (mutable) コレクション / 不変 (immutable) コレクションがある => 詳細は、以下の関連記事を参照のこと
Scala ~ mutable collection ~
https://dk521123.hatenablog.com/entry/2024/07/09/223730
【2】コレクションに関する演算子
文法 | 説明 | 備考 |
---|---|---|
:+ | コレクションの最後に要素を追加 | |
+: | コレクションの最初に追加 | ::演算子(コンス演算子; cons operator)でもいい |
++ | コレクション同士の結合(マージ) | :::演算子 でもいい |
https://tamura70.gitlab.io/lect-prolang/scala/scala-list.html
https://docs.scala-lang.org/ja/overviews/collections/seqs.html
* その他の操作は、以下の関連記事を参照のこと
Scala ~ 基本編 / コレクションで使えるメソッド ~
https://dk521123.hatenablog.com/entry/2023/09/07/223422
1):+演算子
* コレクションの最後に要素を追加
2)+:演算子 / ::演算子
* コレクションの最初に追加
3)++演算子 / :::演算子
* コレクション同士の結合(マージ)
【3】配列 - Array
// Pattern1 val array = Array(1, 2, 3) for (x <- array) { println(x) } // Pattern2 val helloWorlds: Array[String] = new Array[String](3) helloWorlds(0) = "Hello" helloWorlds(1) = ", " helloWorlds(2) = "world" for (helloWorldValue <- helloWorlds) { print(helloWorldValue) }
【4】リスト - Seq
val hellos = Seq("Hello", "World", "!!") for (hello <- hellos) { println(hello) } val byes = Seq("Bye", "Good night", "...") println(byes(0)) println("*****") // ++ : 結合 val newValues = hellos ++ byes for (newValue <- newValues) { println(newValue) } val list = Seq(1, 2, 3, 4, 5) println(list.updated(2, 5)) // ArrayBuffer(1, 2, 5, 4, 5) println(list.map { case 2 => 5; case x => x }) // ArrayBuffer(1, 5, 3, 4, 5) println(list) // ArrayBuffer(1, 2, 3, 4, 5) <= listの値自体は変わっていない
サンプル
import scala.util.control.Breaks._ import scala.collection.immutable // import scala.collection.mutable object Hello { def main(args: Array[String]) { var count: Int = 0 var seq = Seq[Int]() breakable { println("Start") while (true) { count = count + 1 println(s"count = ${count}") seq = seq :+ count if(count == 5) { break } } } println(s"Done. seq=${seq}") } }
【5】集合 - Set
* 重複値は排除
サンプル
val fruits = Set("apple", "orange", "peach", "banana") // apple? = true println("apple? = " + fruits("apple")) // melon? = false println("melon? = " + fruits("melon"))
【6】キーバリュー - Map
例1:Map同士のマージ
val firstMap = Map(1 -> "A1", 5 -> "E1", 3 -> "C") val secondMap = Map(5 -> "E2", 4 -> "D1") // ★Merge val mergedMap = firstMap ++ secondMap // 「E2」とsecondMap でマージされているのが分かる // Done... Map(1 -> A1, 5 -> E2, 3 -> C, 4 -> D1) println(s"Done... ${mergedMap}")
https://www.baeldung.com/scala/merge-two-maps
例2:値の取り出し方
var helloWorldMapper = Map(1->"Hello", 2->"Hi", 3->"Bye") // キーが2の値を取得する => "Hi" println(helloWorldMapper(2)) // ない値はエラー // println(helloWorldMapper(4)) // 値が存在すればSome(値) => Some(Hi) println(helloWorldMapper.get(2)) // 存在しなければNothingを返す => None println(helloWorldMapper.get(4))
例3:Mapのループ
https://dk521123.hatenablog.com/entry/2023/09/07/223422
val sampleMap = Map("x1" -> "Mike", "x2" -> "Tom") // for for ((k,v) <- sampleMap) print(s"key: $k, value: $v / ") println("\n**********") // foreach => Mapの場合、タプルで返され、Keyは、x._1、Valueは、x._2 となる sampleMap.foreach(pair => print(s"key: ${pair._1}, value: ${pair._2} / ")) println("\n**********") sampleMap.foreach { case (key, value) => if (value == "Tom") { print(s"key: $key, value: $value") } } println("\n**********")
【7】タプル - Tuple
* 複数の型の組み合わせ => コレクションではないけど。。。
https://qiita.com/f81@github/items/a8419532c316d190782d
使用上の注意
* タプルは、Max22個まで要素を格納できる => 23個指定するとエラー
サンプル
// Pattern1 val tuple = (1, "Mike", 27) // (tuple_1=,1) println("tuple_1=", tuple._1) // (tuple_2=,Mike) println("tuple_2=", tuple._2) // (tuple_3=,27) println("tuple_3=", tuple._3) // Pattern2 type DemoTuple = (Int, Int, Int) val obj: DemoTuple = (1, 22, 333) println(s"_1 = ${obj._1}") println(s"_2 = ${obj._2}") println(s"_3 = ${obj._3}")
関連記事
Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / クラス ~
https://dk521123.hatenablog.com/entry/2023/03/14/000857
Scala ~ コレクションで使えるメソッド ~
https://dk521123.hatenablog.com/entry/2023/09/07/223422
Scala ~ mutable collection ~
https://dk521123.hatenablog.com/entry/2024/07/09/223730
Scala ~ YAML ~
https://dk521123.hatenablog.com/entry/2023/03/16/012034