Этому вопросу пять лет, но у меня был тот же вопрос только сегодня, и я нашел эту страницу.Я думал, что поделюсь решением, которое я решил использовать, которое не описано ни в одном из существующих ответов и избегает перебора всех ключей на карте.(Пожалуйста, будьте осторожны, это моя первая публикация на SO. Трудно найти вопросы, на которые я могу ответить, на которые еще нет ответов. Более того, каждый вопрос, который у меня был до сих пор, уже задавался на SO. Я использовалТак что в течение многих лет, без возможности комментировать или голосовать за ответы.)
Как уже было сказано, карты разрабатываются таким образом, что, когда у вас есть ключ, вы ищите значение.В этом случае ответом является использование ключа также в качестве значения, чтобы при выполнении поиска с использованием произвольного ключа, который equals
является вашим исходным ключом, но не обязательно ==
, вы получаете обратнооригинальный ключ.Тогда возникает вопрос: как получить то, что изначально предполагалось использовать в качестве значения?
Мое решение зависит от наличия контроля над классом, используемым для ключа, и контроля над картой с возможностью переопределения их,который, кажется, имеет место для OP.В примере OP это будет контроль класса FileDetail
и закрытой переменной map
.Предполагая такой контроль, класс FileDetail
будет изменен, чтобы он содержал переменную-член типа ArrayList<String>
, которую для моего примера кода ниже я буду называть list
, со связанными методами set и getter.Для закрытой переменной map
она будет определена следующим образом:
private HashMap<FileDetail, FileDetail> map = new HashMap<>();
Теперь, когда вы хотите put
новый ArrayList<String>
объект на карте, назначенный определенной клавише FileDetail
Вы вместо этого назначаете объект ArrayList<String>
переменной-члену FileDetail
ArrayList<String>
, а затем помещаете объект FileDetail
в map
.
public void putInMap(FileDetail fd, ArrayList<String> al) {
// Ignoring null conditions for simplicity...
fd.setList(al);
map.put(fd, fd);
}
Позже, когда получитенекоторый произвольный объект FileDetail
(тот, который equals
является ключом, но не обязательно ==
к нему), и вам нужен связанный ключ, это вопрос обычного поиска:
FileDetail otherFd = getArbitraryFileDetail();
FileDetail originalKeyFd = map.get(otherFd);
И чтобы получить связанный ArrayList<String>
после выполнения вышеупомянутого:
ArrayList<String> al = originalKeyFd.getList();
Конечно, все это зависит от реализаций методов equals
и hashCode
класса FileDetail
, ноУ OP уже были те методы, которые были определены как нужные.
Надеюсь, это поможет любому, кто, как и я, заходит на эту страницу в аналогичной ситуации.