Scalaの集合とマップ

 

こんにちはKUJIRAです。今日はScalaの集合とマップについて書きます。

 

集合
ScalaにもJavaと同じように集合があります。集合とは平たく言うと一つの配列の中に重複する値の要素を持つことができない配列のことを言います。Setにはミュータブルなものとイミュータブルの物があります。ミュータブルというのは変化することができるもの、つまり可変ということです。イミュータブルはその逆で不可変ということになります。

 

これがどういう違いになるのかというと、ミュータブルは可変のため集合に変化を加えると結果はそのまま変化を加えられた集合が帰ってきます。しかし、イミュータブルの場合は不可変なので集合に変化を加えても結果はそのままで新たに変化を加えられた後の集合が生成され帰ってきます。Scalaは基本的に全てイミュータブルなので大体は元のものはそのままに新たに変化を加えた集合が別途生成され返されます。

 

では、集合の例を見てみます。

 

scala> var testSet = Set("test1" + "test2")

scala> testSet += "test3"

scala> println(testSet.mkString(","))
test1,test2,test3

 

ここで分かるように集合は「var」で指定すれば追加等々できるようになっています。「val」で行った場合は追加できません。また、同じ値を何度も追加することができますが、実質要素として同じ値の物は一つの要素にまとめられてしまうためいくらやっても要素数は変わりません。

 

マップ
次にマップを見てみます。マップも集合と同じくミュータブルとイミュータブルに別れて用意されてあります。以下は簡単な例です。

 

scala> var testMap = Map[Int, String]()

scala> testMap += (1 -> "one")

scala> testMap += (2 -> "two")

scala> println(testMap(1))
one

 

マップも集合と同じように「var」だと可変のため元のマップに値の追加ができますが、「val」だと元のマップに値の追加はできません。

 

以上で説明した集合とマップですが、valで宣言する場合にミュータブルとイミュータブルとでそれぞれ用意されています。ミュータブル版をインポートして使用すればvalでも値を後付けで追加することができます。つまりデフォルトではイミュータブル版が使われているということです。

 

ミュータブル版のインポートは以下のようにします。

 

scala import scala.collection.mutable.Set    // ミュータブル版の集合
scala import scala.collection.mutable.Map    // ミュータブル版のマップ

 

これで先ほどの変数宣言を「var」から「val」に変えてやると違いがわかると思います。しかし、基本はミュータブル版なんてほとんど使用しないと思います。だってvalは不可変の変数宣言なのでそれをわざわざ可変仕様にする意味がわかりません。単に自分が理解していないだけなのだろうけど。使い込むとそういうのが欲しくなるのかな・・・。ということで今日はここまでKUJIRAでした。