Ответ 1
Я думаю, IdentityHashMap будет делать трюк. Однако обе строки указывают на тот же самый экземпляр, поскольку вы использовали строковый литерал. Попробуйте s1 = new String ( "hi!" ) И s2 = new String ( "hi!" ) Вместе с IdentityHashMap.
Итак, я хотел бы использовать карту 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 при поиске с помощью этого алгоритма необходимо также иметь путь, который был принят до сих пор. Причина, по которой карта хеш-данных, основанная на значении, не работает, заключается в том, что этот алгоритм может повториться по уже изученным узлам. Пути были бы разными в данный момент, хотя значение "где я сейчас?" идентична.
Я думаю, IdentityHashMap будет делать трюк. Однако обе строки указывают на тот же самый экземпляр, поскольку вы использовали строковый литерал. Попробуйте s1 = new String ( "hi!" ) И s2 = new String ( "hi!" ) Вместе с IdentityHashMap.
Отъезд Guava Multimaps (реализации, перечисленные на странице Multimap
).
Вы должны посмотреть IdentityHashMap.
Этот класс реализует карту интерфейс с хэш-таблицей, используя равенство вместо вместо равенство объектов при сравнении ключей (и значения).
Вы ищете мультикарту. Java Collection Framework не дает вам этого. Но вы можете имитировать его, сопоставляя LinkedList
(в конечном итоге с одним элементом) с каждым ключом. Это очень просто.
Просто для полноты: Guava
's MapMaker
делает карты с эквивалентностью идентичности по умолчанию для слабых и программных клавиш. Посмотрите на код здесь