[AD] scalapediaでは記事作成ボランティアを募集しています
ScalaのMap
クラスにおいて、キーや値が特定の条件に合致するもののみ抽出する方法についてご紹介します。
概要
キーや値が特定の条件に合致するもののみ抽出するにはfilter
メソッド、
合致しないもののみ抽出するにはfilterNot
メソッドを使用します。
この種の処理を行いたい場合はfor
式を使った方がより効率的に処理できます。
さて、早速ですが以下のMap
クラスのインスタンスについて見ていきましょう。
val map: Map[Int, String] = Map( 1 -> "apple", 2 -> "orange", 3 -> "grape", 4 -> "strawberry", )
filter メソッドの使い方
特定の条件を満たす要素のみをフィルタリングしたい場合は、filter
メソッドを使用します。
結果として出力された要素がいずれもfilter
メソッドの引数に渡した条件式を満たしており、
満たさない要素はすべて排除されていることを確認してください。
map.filter { case (id, _) => id % 2 == 1 } .foreachEntry((_, fruit) => println(fruit))
apple grape
filterNot メソッドの使い方
特定の条件を満たす要素を除外したい場合はfilterNot
メソッドを使用します。
結果として出力された要素がいずれもfilterNot
メソッドに引数として渡した条件式を満たしておらず、
条件に合致する要素はいずれも含まれていないことを確認してください。
map.filterNot { case (id, _) => id % 2 == 1 } .foreachEntry((_, fruit) => println(fruit))
orange strawberry
for 式で効率的に処理する方法
実は、for
式でもfilter
あるいはfilterNot
メソッド相当の処理を行うことができます。
書き方は、for
式の途中にif
文を追加するだけでOKです。
for { (id, fruit) <- map if id % 2 == 1 } println(fruit)
apple grape
for
式を使った方が効率的に処理できるので、特別な理由がない限りはfor
式を使うようにしましょう。
for
式を使った方が効率的になる理由は、
for
式の内部実装ではfilter
メソッドではなくwithFilter
メソッドを活用しているからです。
withFilter
メソッドにより、
中間コレクションを生成することなく次の処理を行うことができるので、効率的に処理できるのです。
サイト内検索
カテゴリ「Map」の記事
Mapの要素を処理したい!foreach、map、tapEach、foreachElementの使い分け
Mapの要素の数を取得する方法、要素の数を比較する方法は?
Mapのfilter、filterNotメソッドの使い方
+演算子でMapに要素を追加・上書きする方法
Mapクラスのmapメソッドの使い方
containsやexistsの使い方は?Mapにキーや値、要素が含まれるか調べる方法
Mapでイテレータを利用する方法
Mapの値を取得するには?
collect/collectFirstの使い方:Mapの要素を抽出し、それぞれを処理した結果を返すには
Mapのfindで条件に合う要素を一つ取得する方法
カテゴリ「Map」の記事
Mapの要素を処理したい!foreach、map、tapEach、foreachElementの使い分け
Mapの要素の数を取得する方法、要素の数を比較する方法は?
Mapのfilter、filterNotメソッドの使い方
+演算子でMapに要素を追加・上書きする方法
Mapクラスのmapメソッドの使い方
containsやexistsの使い方は?Mapにキーや値、要素が含まれるか調べる方法
Mapでイテレータを利用する方法
Mapの値を取得するには?
collect/collectFirstの使い方:Mapの要素を抽出し、それぞれを処理した結果を返すには
Mapのfindで条件に合う要素を一つ取得する方法