Scalaのコレクション(Array/List/Map/Vector/Set)


Scalaのコレクションを表す次のデータ構造の紹介です。

  • Array => 配列
  • List => リスト構造
  • Vector => 追加削除、検索の速度が一定な万能なデータ構造
  • Map => キーと値のセット
  • Set => 集合
  • Range => 範囲

🍮 Array

Arrayは一般的なプログラミング言語の配列です。

val arr = Array[Int](1, 2, 3, 4, 5) // 型を明確に指定した定義
val arr = Array(1, 2, 3, 4, 5) // 型推論を行った場合の定義

arr(0) //=> 1

🎂 List

Listは一度作成したら中身を変更できない、immutableな構造をしています。

val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
list.map { n => // 関数リテラル
n * n * n
}.filter { n =>
n % 2 == 1
}.sum // => 1225

Listの特徴は次のとおりです。

  • Listは先頭へのアクセスは早い
  • 末尾への要素の追加、ランダムな要素へのアクセスは遅い

Nil

Nilは空のListを表すオブジェクトです。

val a1 = Nil //=> List()

::

::(コンス)はすでにあるListに要素をつけるメソッドです。

val a1 = 1::Nil //=> List(1)

val a2 = 2::a1 //=> List(2, 1)

val a3 = 1 :: 2 :: 3 :: 4 :: Nil //=> List(1, 2, 3, 4)

++

++Listどうしを連結できます。

val a1 = List(1, 2) ++ List(3, 4) //=> List(1, 2, 3, 4)

mkString

mkStringメソッドはListを結合して文字列にします。

List(1, 2, 3, 4).mkString //=> 1234
List(1, 2, 3, 4).mkString(", ") //=> 1, 2, 3, 4
List(1, 2, 3, 4).mkString("[", "-", "]") // => [1-2-3-4]

map

mapメソッドは各要素を加工して新しいListを返します。

List(1, 2, 3, 4).map(x => x * 2) //=> List(2, 4, 6, 8)

filter

filterメソッドは条件にあった要素を抽出した新しいListを返します。

List(1, 2, 3, 4).filter(x => x % 2 == 0) //=> List(2, 4)

find

findメソッドは条件にあった最初の要素を返します。

List(1, 2, 3, 4).find(x => x % 2 == 0) //=> Some(2)

count

countメソッドは条件にマッチする要素の件数を返します。

List(1, 2, 3, 4).count(x => x % 2 == 0) //=> 2

🐞 Vector

Vectorは要素の追加・削除、ランダムなアクセスで一定の速度で処理を行えるimmutableなデータ構造です。

// データの追加
Vector(1, 2, 3, 4):+ 5 //=> Vector(1, 2, 3, 4, 5)

// データの更新
Vector(1, 2, 3, 4).updated(1, 6) //=> Vector(1, 6, 3, 4)

🎉 Map

Mapはキーとバリューのペアのデータ構造です。

val urls = Map(
"apple" -> "https://www.apple.com/jp/",
"google" -> "https://www.google.co.jp/"
)
urls.get("google") //=> Option[String] = Some(https://www.google.co.jp/)

通常のMapimmutableなデータ構造です。

val m = Map("hoge" -> 1, "fuga" -> 2, "pugi" -> 3)

// アップデートされた新しいMapを返す
m.updated("hoge", 4) //=> Map(hoge -> 4, fuga -> 2, pugi -> 3)

// 元のMapはそのまま
m //=> Map(hoge -> 1, fuga -> 2, pugi -> 3)

mutableなデータ構造のMapも利用できます。

import scala.collection.mutable

val m = mutable.Map("hoge" -> 1, "fuga" -> 2, "pugi" -> 3)

// 値をアップデート
m("fuga") = 5

// アップデートした値が使われる
m //=> Map(fuga -> 5, pugi -> 3, hoge -> 1)

🐯 Set

Setは値の集合を表すデータ構造です。Setも通常はimmutableなデータ構造です。

val s = Set(1, 2, 3, 4)

// 4を削除した新しいSet
s - 4 //=> Set(1, 2, 3)

// 元のSetはそのまま
s //=> Set(1, 2, 3, 4)

immutableなデータ構造のSetも利用できます。

import scala.collection.mutable

val s = mutable.Set(1, 2, 3, 4)

// 4を削除
s -= 4

// 元のSetも変更
s //=> Set(1, 2, 3)

🍄 Range

Rangeは範囲を表すオブジェクトでtountilを使って生成できます。

1 to 5 //=> Range 1 to 5

(1 to 6).toList //=> List(1, 2, 3, 4, 5, 6)
(1 until 5).toList //=> List(1, 2, 3, 4)

😀 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍