私はキーと値のペアを格納する方法を探しています。私は双方向であるためにルックアップが必要ですが、同時に同じキーに対して複数の値を格納する必要があります。つまり、BidiMapのようなものですが、すべてのキーに複数の値がある可能性があります。たとえば、 "s1" - > 1、 "s2" - > 1、 "s3" - > 2のようなペアを保持できる必要があり、各キーに値をマッピングできるようにする必要があります。各値について、それに関連付けられたすべてのキーを取得します。Javaの双方向多値マップ
答えて
多対多関係のサポートが必要ですか?あなたが得ることができる最も近いのはGuavaの@MechkovのようなMultimap
ですが、具体的にはMultimap
の組み合わせはMultimaps.invertFrom
です。 "BiMultimap"はまだ実装されていませんが、Google Guavaライブラリにこの機能をリクエストするan issueがあります。あなたの「BiMultimap」は不変定数に起こっている場合
から
Multimaps.invertFrom
とImmutableMultimap
/ImmutableListMultimap
/ImmutableSetMultimap
を(theese 3の各値を格納する別のコレクションを持っている)を使用します。この時点であなたはいくつかのオプションがあります。いくつかのコード(例は私が開発するアプリから取られ、
Enum
sおよびSets.immutableEnumSet
を使用しています):あなたが本当にあなたのMultimapはが変更になりたい場合は、K-> VとV-の両方を維持するのは難しいだろう> K変形を
kToVMultimap
に変更する場合を除いて、invertFrom
としてください。逆コピーをしたい場合は必ずkToVMultimap
を修正しないでください。これは最適ではありませんが、この場合に行うべきです。(お使いの場合は、おそらく、ボーナスとして言及されていない):
BiMap
インタフェースと実装クラスはbiMap.inverse().inverse()
後BiMap<V, K>
BiMap<K, V>
からの眺めと自身を与える.inverse()
方法があります。前に言及したthis issueが実行された場合、それはおそらく何か類似しているでしょう。(EDIT 2016年10月)あなたはまた、Guava 20で存在するであろうnew graph API使用することができます:全体として
、共通します。
- 有向グラフ
- 無向グラフに関連付けられた値(重量、ラベル、等)しない/実行
- グラフと
- ノードおよび/またはエッジを:グラフは、以下の種類のグラフをサポート/実行
- グラフは、そのノード/エッジ挿入順、ソート、又は順不同 ある平行なエッジ(平行なエッジを有するグラフは時々multigraphs呼ばれる)
- グラフを許可しない自己ループ可能
希望私はあなたの右
class A {
long id;
List<B> bs;
}
class B {
long id;
List<A> as;
}
GoogleのGuava MultiMapの実装は、私がこれらの目的で使っているものです。
Map<Key Collection<Values>>
ここで、CollectionはArrayListなどです。これは、コレクションに格納された複数の値をキーにマップすることを可能にします。 これが役立つことを願っています!
双方向ではありません。 – Stefan
私はMultivaluedMapを使用して問題を解決したいと考えています。 オラクル社のドキュメントは、リンク先にあります。 Googleのグアバを使用して
http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html
これはインターフェイスです。実装はありますか? – amoebe
私たちは以下のように原始的BiMulitMapを書くことができます。
import java.util.Collection;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class BiMultiMap<K,V> {
Multimap<K, V> keyToValue = ArrayListMultimap.create();
Multimap<V, K> valueToKey = ArrayListMultimap.create();
public void putForce(K key, V value) {
keyToValue.put(key, value);
valueToKey.put(value, key);
}
public void put(K key, V value) {
Collection<V> oldValue = keyToValue.get(key);
if (oldValue.contains(value) == false) {
keyToValue.put(key, value);
valueToKey.put(value, key);
}
}
public Collection<V> getValue(K key) {
return keyToValue.get(key);
}
public Collection<K> getKey(V value) {
return valueToKey.get(value);
}
@Override
public String toString() {
return "BiMultiMap [keyToValue=" + keyToValue + ", valueToKey=" + valueToKey + "]";
}
}
これは、双方向マルチマップの基本的なニーズに役立ちます。 KとVはhascodeとequalsメソッドを正しく実装する必要があることに注意してください。
- 1. Javaの双方向マップですか?
- 2. Java EE - 1対多の双方向
- 3. 多対多の双方向の双方向@JsonManagedReferenceおよび@JsonBackReference
- 4. ルアの双方向マップ
- 5. Javaリストを使用したHibernateの多対多双方向マッピング
- 6. 双方向1対多
- 7. 関係多対多双方向Symfony 3
- 8. clojureの双方向マップですか?
- 9. Javaソケットプログラミング、双方向通信
- 10. サブクラスとジェネリックの双方向多対1
- 11. 1対多マッピング双方向のデータ
- 12. UML:双方向性と多重性
- 13. GreenDAOとの双方向多対多関係の使い方は?
- 14. 構成とJavaの双方向結合
- 15. 2つのリストのNHibernate双方向多対多マッピング
- 16. 双方向多対多関係の循環参照
- 17. 角型のブール値の双方向バインディング
- 18. Javaによる双方向データバインディング(プログラマチック)
- 19. 双方向Javaクライアント/サーバ通信
- 20. JavaFX:双方向バインディングの初期値
- 21. Vue.js:入力への双方向バインディング値
- 22. ManyToMany双方向
- 23. 双方向バインド
- 24. 双方向カスケード
- 25. 双方向マッピングリスト
- 26. 双方向リスト
- 27. 双方向アソシエーション
- 28. 双方向バブルソートプルーフ
- 29. AngularJS双方向バインディング戻り値なし
- 30. Googleマップのコールバック後のAngular2双方向バインディングの停止作業
キーごとに複数の値を持つ必要がありますが、例では複数の値を持つキーはありません。あなたはおそらくそれを明確にすべきです。あなたの例があなたの質問に合うなら、より良い答えを得るでしょう;-) – pushy
http://www.jguru.com/faq/view.jsp?EID=1317828ここであなたはマルチマップを作成する方法を見つけることができます – maks
@pushy、同じ問題、マップを逆にして、整数をキーの代わりに値として保持すると、1対多のマッピングが得られます。とにかく、訂正してくれてありがとう。 :) –