Я надеюсь, что этот ответ не будет воспринят как пустяк, но, насколько я понимаю, вы хотите использовать библиотеку для чего-то, чего вы можете достичь тривиальным способом, используя jdk из коробки.
В любом случае, вы упомянули, что хотите получить доступ к элементам, используя пару объектов. Вы можете создать класс, который будет содержать ключи, такие как
public class Pair {
// string represntation of an object
private final String x;
private final String y;
// ctor, getters...
public int hashcode() {...}
public boolean equals(Object other) {...}
}
Метод hashcode
сгенерирует хеш-код для всех составляющих элементов (в данном случае два, x
и y
в вашем случае, но может быть легко расширен для поддержки произвольного числа элементов) и два ключи будут одинаковыми, если они имеют одинаковые значения для x
и y
. Если ваши элементы пары не являются простыми строками, тривиально получить строковое представление практически любого объекта (например, обеспечить достойную реализацию метода toString
).
Идея состоит в том, чтобы иметь уникальное строковое представление для каждого элемента в паре.
Конечно, генерация твердых хеш-кодов не тривиальна, поэтому отличный вариант - использовать Strings. Чтобы сгенерировать хеш-код, вы просто добавили бы строковые представления ваших парных объектов:
public int hashcode() {
return ('x' + x + ":y" + y).hashcode();
}
Обязательно укажите какой-нибудь разделитель. В противном случае для таких значений, как x=ab, y=b
и x=a, y=bb
, вы получите один и тот же хэш-код, даже если объекты совершенно разные.
И равенство так же тривиально, как проверка значения элементов в паре:
public boolean equals(Object other) {
// if other is not null and is an instance of Pair
final Pair otherPair = (Pair)other;
return this.x.equals(otherPair.x) && this.y.equals(otherPair.y);
}
Итак, теперь вы можете использовать свой класс Pair
на карте, например:
final Map<Pair, Whatever> map = new Hashmap<Pair, Whatever>();
// ...
По сути, хэш-карта работает с использованием хэш-кода ключей, чтобы определить, в каком сегменте должно быть выделено значение. Если два ключа имеют одинаковый хеш-код, то метод equals будет использоваться для определения того, произошло ли только что столкновение или это просто тот же ключ .
Если вы хотите использовать свой класс Pair
в TreeMap
, вам придется реализовать метод compareTo
или предоставить собственный Comparator
при создании такой карты. Реализации TreeMap
полагаются на результат метода compareTo
, чтобы определить, где должно быть назначено значение.