Tenho dados organizados em formato de "chave-chave", em vez de "valor-chave". É como um HashMap, mas vou precisar de pesquisa O (1) em ambas as direções. Existe um nome para esse tipo de estrutura de dados e algo assim está incluído nas bibliotecas padrão do Java? (ou talvez Apache Commons?)
Eu poderia escrever minha própria aula que basicamente usa dois mapas espelhados, mas prefiro não reinventar a roda (se isso já existir, mas não estou procurando o termo certo).
Além do Apache Commons, o Guava também possui um BiMap .
fonte
Aqui está uma classe simples que usei para fazer isso (eu não queria ter outra dependência de terceiros). Ele não oferece todos os recursos disponíveis no Maps, mas é um bom começo.
fonte
Se nenhuma colisão ocorrer, você sempre pode adicionar ambas as direções ao mesmo HashMap :-)
fonte
Aqui estão meus 2 centavos.
Ou você pode usar um método simples com genéricos. Pedaco de bolo.
Claro que você deve ter um mapa com valores únicos. Caso contrário, um deles será substituído.
fonte
Inspirado pela resposta de GETah, decidi escrever algo semelhante sozinho com algumas melhorias:
Map<K,V>
-Interfaceput
(pelo menos espero garantir aqui)O uso é como um mapa normal, para obter uma visão reversa da chamada de mapeamento
getReverseView()
. O conteúdo não é copiado, apenas uma visualização é retornada.Não tenho certeza se isso é totalmente à prova de idiotas (na verdade, provavelmente não é), então fique à vontade para comentar se notar alguma falha e atualizarei a resposta.
fonte
Uma pergunta bem antiga aqui, mas se outra pessoa tem bloqueio cerebral como eu acabei de fazer e tropeçar nisso, espero que isso ajude.
Eu também estava procurando por um HashMap bidirecional, às vezes as respostas mais simples são as mais úteis.
Se você não deseja reinventar a roda e prefere não adicionar outras bibliotecas ou projetos ao seu projeto, que tal uma implementação simples de arrays paralelos (ou ArrayLists, se o seu design exigir).
Assim que você souber o índice de uma das duas chaves, poderá facilmente solicitar a outra. Portanto, seus métodos de pesquisa podem ser parecidos com:
Isso pressupõe que você está usando estruturas orientadas a objetos adequadas, onde apenas métodos estão modificando esses arrays / ArrayLists, seria muito simples mantê-los paralelos. Ainda mais fácil para um ArrayList, pois você não teria que reconstruir se o tamanho dos arrays mudasse, contanto que você adicionasse / remova em conjunto.
fonte