Quero ter um mapa com chaves duplicadas.
Eu sei que existem muitas implementações de mapa (o Eclipse me mostra cerca de 50), então aposto que deve haver uma que permita isso. Sei que é fácil escrever seu próprio mapa que faça isso, mas prefiro usar alguma solução existente.
Talvez algo em coleções comuns ou coleções google?
java
duplicates
guava
multimap
IAdapter
fonte
fonte
Respostas:
Você está procurando um multimapa e, de fato, tanto as coleções comuns quanto o Guava têm várias implementações para isso. Multimaps permitem várias chaves, mantendo uma coleção de valores por chave, ou seja, você pode colocar um único objeto no mapa, mas você recupera uma coleção.
Se você puder usar o Java 5, eu preferiria o Guava,
Multimap
pois ele reconhece os genéricos.fonte
com.google.common.collect.HashMultimap
temreadObject
/writeObject
métodos, assim como ArrayListMultimap e Immutable {List, Set} Multimap. Eu consideraria uma instância desserializada inútil um bug que vale a pena relatar.Não precisamos depender da biblioteca externa do Google Collections. Você pode simplesmente implementar o seguinte mapa:
Certifique-se de ajustar o código.
fonte
O resultado é:
Nota: precisamos importar arquivos de biblioteca.
http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm
ou https://commons.apache.org/proper/commons-collections/download_collections.cgi
fonte
Você poderia simplesmente passar uma matriz de valores para o valor em um HashMap regular, simulando assim chaves duplicadas, e caberia a você decidir quais dados usar.
Você também pode usar apenas um MultiMap , embora eu não goste da ideia de chaves duplicadas.
fonte
TreeMap<String, ArrayList<MyClass>>
resolvido minhas necessidades de chaves duplicadas.Se você quiser iterar sobre uma lista de pares de valores-chave (como você escreveu no comentário), então uma Lista ou uma matriz deve ser melhor. Primeiro combine suas chaves e valores:
Substitua Class1 e Class2 pelos tipos que deseja usar para chaves e valores.
Agora você pode colocá-los em uma matriz ou lista e iterar sobre eles:
fonte
Este problema pode ser resolvido com uma lista de entradas do mapa
List<Map.Entry<K,V>>
. Não precisamos usar bibliotecas externas nem novas implementações de Map. Uma entrada de mapa pode ser criada assim:Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);
fonte
fonte
Aprenda com meus erros ... por favor, não implemente isso sozinho. Guava multimap é o caminho a percorrer.
Um aprimoramento comum exigido em multimaps é proibir pares de chaves-valor duplicados.
Implementar / alterar isso em sua implementação pode ser irritante.
No Goiaba é tão simples como:
fonte
Eu tinha uma variante ligeiramente diferente desse problema: era necessário associar dois valores diferentes à mesma chave. Apenas postando aqui no caso de ajudar outras pessoas, introduzi um HashMap como o valor:
No código acima, a chave frameID é lida a partir da primeira string de um arquivo de entrada em cada linha, o valor para frameTypeHash é construído dividindo a linha restante e foi armazenado como objeto String originalmente, durante um período de tempo em que o arquivo começou a ter várias linhas ( com valores diferentes) associados à mesma chave frameID, então frameTypeHash foi sobrescrito com a última linha como valor. Substituí o objeto String por outro objeto HashMap como o campo de valor, o que ajudou a manter uma chave única para mapeamento de valor diferente.
fonte
Não são necessárias bibliotecas sofisticadas. Os mapas são definidos por uma chave única, então não os dobre, use uma lista. Streams são poderosos.
E é isso. Exemplos de uso:
fonte
fonte
java-map-duplicate-keys
fonte
que tal um impl MultiMap?
fonte
Você também poderia explicar o contexto para o qual está tentando implementar um mapa com chaves duplicadas? Tenho certeza de que poderia haver uma solução melhor. Os mapas têm como objetivo manter as chaves exclusivas por um bom motivo. Embora se você realmente quisesse fazer; você sempre pode estender a classe, escrever uma classe de mapa personalizado simples que tem uma função de mitigação de colisão e permitiria que você mantenha várias entradas com as mesmas chaves.
Observação: você deve implementar a função de mitigação de colisão de forma que as chaves de colisão sejam convertidas em um conjunto exclusivo "sempre". Algo simples como anexar o código hash do objeto ou algo assim?
fonte
só para ficar completo, o Apache Commons Collections também possui um MultiMap . A desvantagem, claro, é que o Apache Commons não usa Genéricos.
fonte
Com um pequeno hack, você pode usar o HashSet com chaves duplicadas. AVISO: isso depende muito da implementação do HashSet.
fonte
Se houver chaves duplicadas, uma chave pode corresponder a mais de um valor. A solução óbvia é mapear a chave para uma lista desses valores.
Por exemplo em Python:
fonte
Eu usei este:
java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();
fonte