Существует ли коллекция Java (или аналогичная), которая ведет себя как таблица SQL с автоматическим идентификатором? - PullRequest
6 голосов
/ 17 марта 2009

Обратите внимание, что я на самом деле ничего не делаю с базой данных, поэтому инструменты ORM, вероятно, не то, что я ищу.

Я хочу иметь несколько контейнеров, каждый из которых содержит несколько объектов, причем все объекты в одном контейнере принадлежат к одному и тому же классу. Контейнер должен показывать некоторые характеристики таблицы базы данных, а именно:

  • разрешить использование одного из полей объекта в качестве уникального ключа, т.е. е. другие объекты, имеющие такое же значение в этом поле, не добавляются в контейнер.
  • после принятия нового объекта контейнер должен выдать числовой идентификатор, который возвращается вызывающей стороне метода вставки.

Вместо того, чтобы выдавать ошибку, когда запрашивается «повторяющаяся запись», контейнер должен просто пропустить вставку и вернуть ключ уже существующего объекта.

Теперь я бы написал общий контейнерный класс, который принимает объекты, которые реализуют интерфейс, чтобы получить значение ключевого поля, и использовать HashMap с этими значениями в качестве фактического класса хранения. Есть ли лучший подход с использованием существующих встроенных классов? Я просматривал HashSet и тому подобное, но они не подходили.

Ответы [ 4 ]

4 голосов
/ 17 марта 2009

Ни один из классов Коллекции не сделает то, что вам нужно. Вам придется написать свой собственный!

P.S. Вам также необходимо решить, будет ли ваш класс поточно-ориентированным или нет.

P.P.S. ConcurrentHashMap близко, но не совсем то же самое. Если вы можете создать подкласс, или обернуть его, или обернуть объекты, которые входят в вашу карту, так что вы полагаетесь только на этот класс для обеспечения безопасности потоков, у вас будет эффективная и поточно-ориентированная реализация.

3 голосов
/ 17 марта 2009

Вы можете смоделировать это поведение с помощью HashSet . Если объекты, добавляемые в коллекцию, имеют поле, которое можно использовать в качестве уникального идентификатора, просто верните это поле методом hashCode () объекта (или используйте значение вычисленного хеш-кода , либо путь должен работать).

HashSet не выдаст ошибку, когда вы добавите повторяющуюся запись, он просто вернет false. Вы можете обернуть (или расширить) HashSet, чтобы ваш метод add возвращал уникальный идентификатор, который вы хотите получить в качестве возвращаемого значения.

1 голос
/ 17 марта 2009

Есть ли причина, по которой хеш-код объекта нельзя использовать в качестве "числового идентификатора"?

Если нет, то все, что вам нужно сделать, это поместить вызов в ConcurrentHashMap, вернуть hashCode объекта и использовать метод putIfAbsent (ключ K, значение V), чтобы гарантировать, что вы не добавите дубликаты.

putIfAbsent также возвращает существующее значение, поэтому вы можете получить его hashCode для возврата вашему пользователю.

См. ConcurrentHashMap

1 голос
/ 17 марта 2009

Я думал, что вы можете сделать это с ArrayList, используя текущее местоположение в массиве в качестве «id», но это не мешает вам сделать вставку в существующее местоположение, плюс когда вы вставляете в это место это будет двигать все вверх. Но вы можете основывать свой собственный класс на ArrayList, возвращая текущее значение .size () после .add.

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