[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、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
の要素の数を比較する方法について説明します。
sizeCompareメソッドを使用して要素の数を比較する
要素の数を比較するには、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
メソッドを使用することをおすすめします。