Подтвердить что ты не робот

Карта Java на основе ссылки на объект?

Итак, я хотел бы использовать карту java, где ключи являются объектом... но вместо того, чтобы вводить ключ в значение объекта, они вводят идентификатор объекта. Итак, что-то вроде следующего будет полностью допустимым кодом:

Map<String, Integer> map = new HashMap<String, Integer>();

String s1 = "hi!";
String s2 = "hi!";

map.put(s1, 10);
map.put(s2, 47);

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

Спасибо.

EDIT: Дополнительная информация.

Приведенный выше пример был просто примером. Для этого я буду использовать алгоритм поиска Uniform-Cost. Для любого заданного node при поиске с помощью этого алгоритма необходимо также иметь путь, который был принят до сих пор. Причина, по которой карта хеш-данных, основанная на значении, не работает, заключается в том, что этот алгоритм может повториться по уже изученным узлам. Пути были бы разными в данный момент, хотя значение "где я сейчас?" идентична.

4b9b3361

Ответ 1

Я думаю, IdentityHashMap будет делать трюк. Однако обе строки указывают на тот же самый экземпляр, поскольку вы использовали строковый литерал. Попробуйте s1 = new String ( "hi!" ) И s2 = new String ( "hi!" ) Вместе с IdentityHashMap.

Ответ 2

Отъезд Guava Multimaps (реализации, перечисленные на странице Multimap).

Ответ 3

Вы должны посмотреть IdentityHashMap.

Этот класс реализует карту интерфейс с хэш-таблицей, используя равенство вместо вместо равенство объектов при сравнении ключей (и значения).

Ответ 4

Вы ищете мультикарту. Java Collection Framework не дает вам этого. Но вы можете имитировать его, сопоставляя LinkedList (в конечном итоге с одним элементом) с каждым ключом. Это очень просто.

Ответ 5

Просто для полноты: Guava 's MapMaker делает карты с эквивалентностью идентичности по умолчанию для слабых и программных клавиш. Посмотрите на код здесь