Mapの要素の数を取得する方法、要素の数を比較する方法は?

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年5月19日

[AD] scalapediaでは記事作成ボランティアを募集しています

この記事では、Mapの要素の数を取得する方法と要素の数を比較する方法をご紹介します。

サンプルでは、以下のMapを使用して説明していきます。

// 対象のMap val mapOrg = Map(1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d", 5 -> "e") // mapOrgと同じ要素数を持つMap val mapSame = Map(6 -> "f", 7 -> "g", 8 -> "h", 9 -> "i", 10 -> "j") // mapOrgより少ない要素数を持つMap val mapLT = Map(6 -> "f", 7 -> "g", 8 -> "h", 9 -> "i") // mapOrgより大きい要素数を持つMap val mapGT = Map(6 -> "f", 7 -> "g", 8 -> "h", 9 -> "i", 10 -> "j", 11 -> "k")

Mapの要素の数を取得する

ここでは、Mapの要素の数を取得する方法を説明します。

sizeメソッドを使用して要素の数を取得する

sizeメソッドを使用して、Mapの要素の数を取得できます。

以下のサンプルでは、前述のmapOrgの要素の数を取得しています。

println(mapOrg.size)

実行結果は、以下のようになります。

5

countメソッドを使用して要素の数を取得する

countメソッドを使用して、Mapの要素のうち条件に該当する要素の数を取得することができます。

以下のサンプルでは、前述のmapOrgの要素のうち、キーが偶数の要素の数を取得しています。

println(mapOrg.count(t => t._1 % 2 == 0))

実行結果は、以下のようになります。

2

また、上記サンプルでは、countメソッドの引数には、キーと値のTupleを受け取り、Booleanを返す関数を渡していますが、以下のようにcaseを使用して記述することもできます。

println(mapOrg.count {case (k, _) => k % 2 == 0})

実行結果は、以下のようになります。

2

Mapの要素の数を比較する

ここでは、Mapの要素の数を比較する方法について説明します。

sizeメソッドを使用して要素の数を比較する

以下のサンプルでは、前述のsizeメソッドを使用して、2つのMapの要素の数を比較しています。
以下の関数では、2つのMapを引数で受け取り、それぞれのMapに対して、sizeメソッドで要素数を取得してから、その値を比較しています。

def compare(a: Map[Int, String], b: Map[Int, String]): String = { val sizeA = a.size val sizeB = b.size if(sizeA < sizeB) { "a.size < b.size." } else if(sizeA == sizeB) { "a.size == b.size." } else { "a.size > b.size." } }

上記関数を呼び出してみます。

println(compare(mapOrg, mapGT)) println(compare(mapOrg, mapSame)) println(compare(mapOrg, mapLT))

実行結果は、以下のようになります。

a.size > b.size. a.size == b.size. a.size < b.size.

sizeCompareメソッドを使用して要素の数を比較する

2.13以降では、sizeCompareメソッドを使用して要素の数を比較することができます。
sizeCompareメソッドは、自身の要素の数と引数で渡されたIterableトレイの要素の数、または、Intの値を比較した結果、以下の値を返します。

  • 自身の要素の数 < 引数で渡された値 : 0より小さい値
  • 自身の要素の数 = 引数で渡された値 : 0
  • 自身の要素の数 > 引数で渡された値 : 0より大きな値

引数にMapを渡した場合

以下のサンプルでは、sizeCompareメソッドにMapを渡して要素の数を比較しています。

def compareToMap(a: Map[Int, String], b: Map[Int, String]): String = { a.sizeCompare(b) match { case x if x < 0 => s"a.size < b.size." case x if x == 0 => s"a.size == b.size." case x if x > 0 => s"a.size > b.size." } }

上記関数を呼び出してみます。

println(compareToMap(mapOrg, mapGT)) println(compareToMap(mapOrg, mapSame)) println(compareToMap(mapOrg, mapLT))

実行結果は、以下のようになります。

a.size < b.size. a.size == b.size. a.size > b.size.

引数にIntを渡した場合

以下のサンプルでは、sizeCompareメソッドに'Int'を渡して要素の数を比較しています。

def compareToInt(a: Map[Int, String], size: Int): String = { a.sizeCompare(size) match { case x if x < 0 => s"a.size < ${size}." case x if x == 0 => s"a.size == ${size}." case x if x > 0 => s"a.size > ${size}." } }
println(compareToInt(mapOrg, 6)) println(compareToInt(mapOrg, 5)) println(compareToInt(mapOrg, 4))

実行結果は、以下のようになります。

a.size < b.size. a.size == b.size. a.size > b.size.

sizeIsメソッドを使用して要素の数を比較する

前述のsizeCompareメソッドを使用した方法は、sizeメソッドで取得した要素数を比較する方法と比べると、コードの可読性は低くなります。
sizeCompareメソッドの代わりに、sizeIsメソッドを使用することで可読性の高いコードを記述することができます。

sizeIsメソッドを利用すると、以下のように比較演算子を使用して、Mapの要素の数を比較することができます。

println(mapOrg.sizeIs < 5) println(mapOrg.sizeIs <= 5) println(mapOrg.sizeIs == 5) println(mapOrg.sizeIs != 5) println(mapOrg.sizeIs >= 5) println(mapOrg.sizeIs > 5)

実行結果は、以下のようになります。

false true true false true false

前述のsizeCompareメソッドを使用したサンプルを、sizeIsメソッドで書き換えると以下のようになります。

def compare(a: Map[Int, String], size: Int): String = { a.sizeIs match { case x if x < size => s"a.size < ${size}." case x if x == size => s"a.size == ${size}." case x if x > size => s"a.size > ${size}." } }

上記関数を呼び出してみます。

println(compare(mapOrg, 6)) println(compare(mapOrg, 5)) println(compare(mapOrg, 4))

実行結果は、以下のようになります。

a.size < 6. a.size == 5. a.size > 4.

コレクションの実装によっては、sizeメソッドは、実行コストが高くなる場合があります。
sizeCompareメソッド/sizeIsメソッドは、sizeメソッド以下の計算量となるため、 sizeCompareメソッドか、sizeIsメソッドを使用することをおすすめします。

サイト内検索