Ключ в HashMap Java - PullRequest
       4

Ключ в HashMap Java

0 голосов
/ 07 февраля 2012

Я обычно сталкиваюсь со сценариями при использовании HashMap в Java следующим образом:У меня есть список объектов класса A (List<A>)A имеет поля int f1, int f2 и другие поля.

Я должен составить карту из List, чтобы выполнить поиск O (1) для объектов A. Ключ - это сочетание f1 и f2 (обабудучи целыми числами).

Теперь, что из следующего было бы наилучшей практикой для использования на картеслучай 1: в общемслучай 2: f2 может принимать только от 2 до 3 различных значений, в то время как f1 может принимать большое количество значений.

Map<Integer, Map<Integer, List<A>>>  // construction of map is cumbersome
Map<String, List<A>>                 //(key : String f1 + "_" + f2)
Map<Integer, List<A>>          //(I tend to use this for case 2)

Пропущено, чтобы прояснить одну вещь здесь.f1 и f2 не однозначно идентифицируют объекты A. Исправлены определения карты.

Ответы [ 5 ]

0 голосов
/ 25 мая 2017

Ключ уникален в HashMap ... потому что внутренне в Java ключ установлен как

final Key

int static Класс ввода в Java

Вот почему ключ уникален, он не допускает дублирования ...

0 голосов
/ 07 февраля 2012

Мне не нравится использовать строки в качестве составных ключей. Некоторые блоггеры говорят, что это хорошо: строки хороши для текста, а не для текста.

Почему бы просто не создать простой класс IntPair с двумя полями int и соответствующими переопределениями hashCode() и equals(Object)? Это займет у вас две секунды в IDE (не намного дольше без него), и у вас будет более конкретный, семантически значимый тип ключа.

0 голосов
/ 07 февраля 2012

Я думаю, что карта подходит для случая 1, и для случая, я рекомендую Список, и этот список имеет только 2-3 элемента, тогда вы можете сопоставить индекс с определенным значением поля.

0 голосов
/ 07 февраля 2012

Зачем вообще использовать карту?Если вам действительно не нужны пары ключ-значение, вы можете просто использовать HashSet<A>.Поиск по-прежнему O (1), и вам не нужно беспокоиться о получении значения из ключа.

Конечно, HashSet, вероятно, просто HashMap с нулевыми значениями, но вам не нужно придумывать ключи и значения.

0 голосов
/ 07 февраля 2012

Если эти два поля имеют тенденцию быть неизменными (они не меняются после установки), вы можете переопределить equals() и hashCode() методы A и просто сохранить:

Set<A>    //(key: fields f1 and f2, via hashCode() method)

Если они не являются неизменяемыми, вы все равно не сможете использовать их для ключа, так как они могут измениться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...