2017-06-09 7 views
2

スカラマップでは、同じ値を持つマップ内のすべてのキーを取得するにはどうすればよいですか?Scalaマップにはfindallはありますか?

は、例えば、私の地図に私が値27

例:持っている3つのキーがあります。

large -> 27 
indispensable -> 27 
most -> 27 

を私は

val adj1value = htAdjId.find(_._2 == value1).getOrElse(default)._1 

を試してみましたが、それは私の最初のキー「大を与えます"(findのdefinitionがそうであるように)。私は多くを検索しましたが、私は "findall"関数を見つけることができません。 Scalaには存在しますか?そうでない場合は、誰かがこの問題を解決する方法についてアドバイスをお願いしますか?

+2

代わりに 'filter'を使用してください。 'find'は最初のマッチで停止します – cheseaux

+0

あなたは' Traversable.forall(p:A => Boolean):Boolean'と思っています。 – Stephen

答えて

0

あなたは、コレクションをフィルタリングし、keysを使用してすべてのキーを抽出することができます。私はそれはおそらく、あなたが毎回Map全体を反復する必要がある場合と主張していると思いますけれども

val map = Map("h" -> 27, "b" -> 2, "c" -> 27) 
map.filter { case (key, value) => value == 27 }.keys 

res0: Iterable[String] = Set(h, c) 

を生み出します適切なデータ構造ではない場合は、おそらくList[(String, Int)]で十分で、Mapを使用して発生するオーバーヘッドを節約できます。

+0

私は最後の段落に同意します。ルックアップが常にこの方法である場合、 'Map'は単純に間違った方法です。両方の方向でルックアップが必要な場合は、 'BidiMap'(別名BiMap)、より正確には' MultiBiMap'/'MultiBidiMap' /' BiMultiMap '( 'BiMap'とも呼ばれます) '/' BidiMultiMap'(またはそれが呼び出されたもの)は、選択したデータ構造になります。 (実際には、データ構造はSQLテーブルのように双方向の関係になっています。) –

0

あなたは[オフライン私の友人で答え]ハッシュマップは、通常は前方を行うために構築されている反復処理可能[K、V]その後、GROUPBYこのような値が..

@ Map(
    "large" -> 27, 
    "indispensable" -> 27, 
    "most" -> 27 
).groupBy(_._2).mapValues(_.keys) 

res4: Map[Int, Iterable[String]] = Map(27 -> Set(
    "large", 
    "indispensable", 
    "most")) 
+0

答えはすべての値が27であると仮定します。 –

0

ようなマップを扱うことができます効率的に検索する。ハッシュマップで使用されている基本的なデータ構造がこれをサポートしていることが分かっていない限り、おそらくが効率的でないため、この「逆引き参照」を実行する必要はありません。

データを双方向でアクセスする場合は、最初からbi-directional mapまたは「バイマップ」にデータを置くことを検討してください。または、two hashmapsを使用してください:1つは規則的な方向、1つは反転されたもの(値はキーになり、キーは値になります)または異なるデータ構造を使用します。

の2つのマップが適しています。マップが大きい場合や、このようなチェックをたくさん行う場合は、2つのマップをおすすめします。それ以外の場合は、代わりにフィルタを試してください

+0

[私は彼に尋ねた]私の価値は一意ではありません。双方向地図も同様に動作しますか?グアバのバイマップを使用するには、値とキーも一意にする必要はありませんか? – mithunpaul

+0

[彼の返信]そうすれば、双方向地図はおそらく動作しません。一度逆転をしているだけなら、 'val value2adj = htAdjId.groupBy {case(k、v)=> v} .map {case(k、v)=> k - > v}のようにgroupByを試してみてください。 。地図(_。_1)} ' これは、値からその値を持つキーのリストへのマップを提供します。次に、getOrElseを使用します。おそらくこれを行うためのショートカットさえあります。 – mithunpaul

関連する問題