4

マップのサブセットを取得するにはどうすればよいですか?

私たちが持っていると仮定します

val m: Map[Int, String] = ...
val k: List[Int]

のすべてのキーがk存在する場所m

mここで、キーがリストにあるペアのみを含むMap のサブセクトを取得したいと思いますk

のようなものm.intersect(k)ですがintersect、マップ上では定義されていません。

1 つの方法は、 : を使用することfilterKeysですm.filterKeys(k.contains)。ただし、元のマップのキーごとにリスト内の検索を実行する必要があるため、これは少し遅くなる可能性があります。

私が考えることができる別の方法は、ですk.map(l => (l, m(l)).toMap。ここでは、本当に関心のあるキーを反復処理するだけで、検索は行いません。

より良い(組み込みの)方法はありますか?

4

3 に答える 3

15
m filterKeys k.toSet

なぜなら、 aSetは aFunctionです。

パフォーマンスについて: それ自体は O(1) です。これは、オーバーライドされた、、およびメソッドを使用filterKeysして新しいマップを生成することで機能するためです。オーバーヘッドは、要素がアクセスされるときに発生します。これは、新しいマップが余分なメモリを使用しないことを意味しますが、古いマップのメモリを解放できないことも意味します。foreachiteratorcontainsget

メモリを解放し、可能な限り高速にアクセスする必要がある場合はk、中間の を生成せずに の要素を新しい Mapに折り畳むのが手っ取り早い方法List[(Int,String)]です。

k.foldLeft(Map[Int,String]()){ (acc, x) => acc + (x -> m(x)) }
于 2012-08-27T18:09:09.063 に答える
2

val s = Map(k.map(x => (x, m(x))): _*)

于 2012-08-28T06:56:13.553 に答える
1

これは最も読みやすく、優れたパフォーマーだと思います:

k zip (k map m) toMap

または、メソッド呼び出しスタイルは次のようになります。

k.zip(k.map(m)).toMap

于 2012-08-31T15:38:41.617 に答える