2012-03-28 2 views
11

私は実際にグーグルグアバライブラリのMultimapクラスが好きです。これは、キーの複数の値を追加できるマップ型であるため、キーからある種のコレクションに効果的にマッピングされます。私が特に気に入っているのは関数で、Iterableとキー関数をとり、を返します。Iterableの要素を、それらの要素ごとに返す値でグループ化(またはインデックス付けまたはマップ)します。なぜGuava Multimap.values()はコレクションのコレクションではなくフラットなコレクションを返しますか?

少し奇妙なことは、Multimap.values()がコレクションのコレクションではなくフラットなコレクションを返すことです。だから、インデックス関数が私に与えたグループ化は、一度値を取得すると失われます。私はMultimap.asMap()を呼び出すことによってその問題を回避し、その上でvalues()を呼び出すことができます。

誰でも、なぜMultimapがそのように振舞うのか理解できますか?

答えて

13

Multimap.asMap().values()周りの問題な方法ではありません - MultimapasMap().values()経由Collection<Collection<V>>を取得し、values()と平坦化Collection<V>を取得し、それをアクセスする両方な方法を提供することを意図的でした。

もっと一般的に言えば、Multimapはではなく、「コレクションへのマップ」というだけで「キーを複数の値に関連付ける一般的な方法」にしようとします。だからvalues()keys()に加えてentries()メソッドがあります。 asMap()ビューはそれを「コレクションへのマップ」として扱う方法を提供しますが、それは常にあなたが探しているものとは異なる非常に異なるセマンティクスを持っています。

いずれにしても、valuesメソッドは、asMap().values()で埋められたものとは異なるニッチを埋めるためのものです。

+0

私は通常、マルチマップを使用しています。したがって、「問題」によって、私はドメインの問題を意味し、Multimap-APIの問題は意味しませんでした。私はAPIを批判していたように聞こえてはいけません。その背後にある哲学については、あまり理解していませんでした。ご回答有難うございます。 – nansen

+2

@nansen:Multimapが2つの概念が重複していることを隠そうとしているようではありません(たとえば、キー()を繰り返し実行し、そのキーの値のコレクションを取得するために 'get(key) 'を実行できます)。理解するのは、マルチマップのすべての値を尋ねると、通常のマップと同様に、関連するキーは気にしないということだけです。それ以外の場合は 'Map >'として表示するライブビューを表示します。あなたは 'asMap'は何もコピーをしていないことを認識していますよね?同じデータを別の視点から見るだけなので、オーバーヘッドはごくわずかです。 –

+1

私は、再利用性の重要な原則を表現しているので、この見方が気に入っています。 Alan Perlis氏は次のように述べています。「10個のデータ構造に対して10個の関数より100個の関数が1つのデータ構造で動作するほうがよい。" – nansen

6

マルチマップがそのように動作するのはなぜなのでしょうか?

マルチマップは、キーが一意である必要がない通常のマップとして表示する必要があります。

Key  Val 
a -> 1 
b -> 2 
a -> 3 

Values: {1, 2, 3} 
+1

私は、通常のマップは 'values()'から返された値をキー(反復順序以外)に関連付けるものではないと思うので、なぜMultipapはその規約から離れるべきですか?もしそうなら、私は同意します。 –

+0

それはそれを置く別の方法です。 – aioobe

関連する問題