1. ホーム

[解決済み】同じキーで複数の値を持つHashMap

2022-04-05 17:44:54

質問

1つのキーと2つの値を持つHashMapを実装することは可能でしょうか?HashMapと同じように?

また、1つをキーとして3つの値のストレージを実装する他の方法を教えてください(方法がない場合)、私を助けてください?

どのように解決するのですか?

可能です。

  1. リストを値とするマップを使用する。 Map<KeyType, List<ValueType>> .
  2. 新しいラッパークラスを作成し、このラッパーのインスタンスをマップに配置します。 Map<KeyType, WrapperType> .
  3. タプルのようなクラスを使用する(多くのラッパーを作成する必要がない)。 Map<KeyType, Tuple<Value1Type, Value2Type>> .
  4. 複数のマップを並べて使用する。

事例紹介

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つのマップが同期しなくなることです。