[解決済み】同じキーで複数の値を持つHashMap
2022-04-05 17:44:54
質問
1つのキーと2つの値を持つHashMapを実装することは可能でしょうか?HashMapと同じように?
また、1つをキーとして3つの値のストレージを実装する他の方法を教えてください(方法がない場合)、私を助けてください?
どのように解決するのですか?
可能です。
-
リストを値とするマップを使用する。
Map<KeyType, List<ValueType>>
. -
新しいラッパークラスを作成し、このラッパーのインスタンスをマップに配置します。
Map<KeyType, WrapperType>
. -
タプルのようなクラスを使用する(多くのラッパーを作成する必要がない)。
Map<KeyType, Tuple<Value1Type, Value2Type>>
. - 複数のマップを並べて使用する。
事例紹介
1. リストを値とするマップ
// create our map
Map<String, List<Person>> peopleByForename = new HashMap<>();
// populate it
List<Person> people = new ArrayList<>();
people.add(new Person("Bob Smith"));
people.add(new Person("Bob Jones"));
peopleByForename.put("Bob", people);
// read from it
List<Person> bobs = peopleByForename["Bob"];
Person bob1 = bobs[0];
Person bob2 = bobs[1];
この方法の欠点は、リストが正確に2つの値に束縛されないことです。
2. ラッパークラスの使用
// define our wrapper
class Wrapper {
public Wrapper(Person person1, Person person2) {
this.person1 = person1;
this.person2 = person2;
}
public Person getPerson1 { return this.person1; }
public Person getPerson2 { return this.person2; }
private Person person1;
private Person person2;
}
// create our map
Map<String, Wrapper> peopleByForename = new HashMap<>();
// populate it
peopleByForename.put("Bob", new Wrapper(new Person("Bob Smith"),
new Person("Bob Jones"));
// read from it
Wrapper bobs = peopleByForename.get("Bob");
Person bob1 = bobs.getPerson1;
Person bob2 = bobs.getPerson2;
この方法の欠点は、これらの非常に単純なコンテナ・クラスすべてについて、多くの定型的なコードを書かなければならないことです。
3. タプルの使用
// you'll have to write or download a Tuple class in Java, (.NET ships with one)
// create our map
Map<String, Tuple2<Person, Person> peopleByForename = new HashMap<>();
// populate it
peopleByForename.put("Bob", new Tuple2(new Person("Bob Smith",
new Person("Bob Jones"));
// read from it
Tuple<Person, Person> bobs = peopleByForename["Bob"];
Person bob1 = bobs.Item1;
Person bob2 = bobs.Item2;
これが私の考える最良の解決策です。
4. 複数の地図
// create our maps
Map<String, Person> firstPersonByForename = new HashMap<>();
Map<String, Person> secondPersonByForename = new HashMap<>();
// populate them
firstPersonByForename.put("Bob", new Person("Bob Smith"));
secondPersonByForename.put("Bob", new Person("Bob Jones"));
// read from them
Person bob1 = firstPersonByForename["Bob"];
Person bob2 = secondPersonByForename["Bob"];
このソリューションの欠点は、2つのマップが関連していることが明白でないこと、プログラム上のエラーが発生すると2つのマップが同期しなくなることです。
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
[解決済み] ストリングビルダー.イコール Java
-
[解決済み] Java- <T extends Comparable<T>>の意味?
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] ハッシュマップのキーを指定して、値を更新するには?
-
[解決済み] Java Hashmap。値からキーを取得する方法は?
-
[解決済み] HashMapのキー存在チェック
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] トークンのシンタックスエラー、これらのトークンを削除してください [closed].
-
[解決済み] Application startメソッドで例外が発生する。JavaFx 11
-
[解決済み] このフォーマット(Tue Jul 13 00:00:00 CEST 2010)の日付をJavaの日付に変換する方法(文字列はalfrescoのプロパティに由来しています)
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] コレクションへの共有参照が見つかりました org.hibernate.HibernateException
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] 文字列の長さに応じて文字列をトリミングする
-
[解決済み] Java: getInstanceとStaticの比較