2012-01-26 9 views
3

私はまたコレクションであるマップを持っていたいと思います。具体的には、特定のキーに複数のエントリがある場合を含めて、マップのエントリを繰り返し処理できるようにしたいと考えています。地図もコレクションにできますか?

私が解決しようとしている特定の問題は、c:forEachを使用して反復し、${a.b.c}のような式の両方でjstlで使用できるオブジェクトを提供することです。この例では、${a.b.c}を最初の値であるc(または存在しない場合はnull)と評価したいだけですが、cをすべて<c:forEach items="${a.b.c}">で繰り返してループボディにそれぞれcマップには同じキーがありますが

メソッドの観点から見ると、これは簡単で、entrySet()メソッドが同じキーを持つ複数のエントリを持つセットを返すMapの実装を提供するだけです。しかし、これはマップの契約に違反しているように見えるので、物事は微妙で悲惨な方法で打ち壊されるのだろうか?他の誰かがこのようなことをしていますか?

(あなたは私がXMLを提示しようとしていると推測した場合、あなたは正しいだろう)

EDIT

これはJSTLに使用するためのものであることに注意してください、そう何インタフェース私が提示満たしている必要があります。 2つの条件:[].演算子で使用するため

  • 、それはMapList、アレイやJavaBeansオブジェクトでなければなりません(そのうちのそれをすることはできませんforEachので使用するためのリストまたは配列インデックスが数字ではありませんので)
  • は、配列、CollectionIteratorEnumerationMap、またはStringでなければなりません。

だけそう.containsKey().get()、および.entrySet()を呼び出し、侵害された不変量を気にしませ、および内部で保存しません地図のコピーをしていない私は、本当の問題があると思い、私はJSTL に数えることができます特別な反復動作。

答えて

5

あなたが探しているものはMultimapです。 Guavaはその実装を提供し、特にArrayListMultimapを探しています。

+0

閉じるが、それは私が必要とするもののようには見えない。私は 'get()'メソッドがすべての値のリストを返すことを望んでいません。私はそれがいくつかの明確に定義された値(最初の値)を返すようにします。また、 'Map'ではないようですので、jstl ELで変更せずに使うことはできません。 –

0

私はやっとJSTLを覚えていますが、何を言っていることは、論争の種類の音: をforeachのでは:

ここで$ {A.B.C}

は、値のいくつかのコンテナを指している必要がありますし、我々はそれを反復します。

一方、$ {a.b.c} "はcの最初の値に評価する必要があります(またはnull ...) その曖昧な定義です。

Multimapはあなたが望むものではないように感じる場合は、あなたがあなた自身のコレクションの実装を提供することができますが(おそらく内部Multimapはに基づいて)

ちょうどアイデアとして、あなたが常にリストとして単一の要素を見ることができます(その誤って は1つの要素で構成されています)。あなたのあいまいさを解決するこの方法で、私は推測します。

私は、これは取り返しのつかないMap契約を破る同じキーに対して複数のエントリを持つMapを持つ

+0

はい、表現はあいまいであり、文脈によって意味が異なります。しかし、文字列の値が正確に最初の値になると言うことで、実装で明快にすることができます。この全体的な問題は、あいまいな状況の中で最良のもの(明確に定義されているもので例外ではなく、明白な理由で正しいものではない)を作ることから来ています。 –

0

に役立ちます願っています。 Multimapがうまく動作しない場合は、多くのことを壊すことなくこれを行う方法はありません。

具体的には、怪物をMapとするよう指定されたものに渡すと、それはほぼ確実に壊れてしまいます。それはあなたがそれでやりたいことなのです。

+0

それはありますか?それは契約には合致しませんが、実際に違反していると考えることができる唯一の不変条件は∀x∈Map.entrySet x.getValue == Map.get(x.getKey)であり、心配ですか? –

+0

keySet()。size()== entrySet()。size()というアイデンティティを壊します。しかし、あなたがすでに言及している不変量は、実際にはMapの引数を取るコードのかなり一般的な前提です。もしあなたがそれを壊したなら、間違ったものをすべて知る方法はありません。 –

0

コレクションを値として使用する方法について教えてください。同じキーに対して異なる値を持つことができ、ネストされたforeach-loopによって反復処理することができます

既存のマップ実装のラッパーも簡単に書くことができます。そのようにする必要がある場合