Вы можете:
Map<KeyType, List<ValueType>>
. Map<KeyType, WrapperType>
. Map<KeyType, Tuple<Value1Type, Value2Type>>
. 1. Карта со списком как значение
// create our map
Map<string, List<Person>> peopleByForename = new HashMap<string, List<Person>>();
// populate it
List<Person> people = new ArrayList<Person>();
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. Использование класса-оболочки
// 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<string, Wrapper>();
// populate it
Wrapper people = new Wrapper()
peopleByForename.put("Bob", new Wrapper(new Person("Bob Smith"),
new Person("Bob Jones"));
// read from it
Wrapper bobs = peopleByForename["Bob"];
Person bob1 = bobs.Person1;
Person bob2 = bobs.Person2;
Недостатком такого подхода является то, что вам нужно написать много кода котельной для всех этих очень простых классов контейнеров.
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<string, Tuple2<Person, Person>>();
// 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<string, Person>();
Map<string, Person> secondPersonByForename = new HashMap<string, Person>();
// 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"];
Недостатком этого решения является то, что не очевидно, что эти две карты связаны, программная ошибка может видеть, что две карты выходят из синхронизации.