Coleções Apache Commons BidiMap
1. Visão geral
Neste breve artigo, veremos uma estrutura de dados interessante na biblioteca de coleções do Apache Commons - oBidiMap.
OBidiMap adiciona a possibilidade de pesquisar a chave usando o valor correspondente na parte superior da interfaceMap padrão.
2. Dependências
Precisamos incluir a seguinte dependência em nosso projeto para usarmosBidiMape suas implementações. Para projetos baseados em Maven, temos que adicionar a seguinte dependência ao nossopom.xml:
org.apache.commons
commons-collections4
4.1
Para projetos baseados em Gradle, temos que adicionar o mesmo artefato ao nosso arquivobuild.gradle:
compile 'org.apache.commons:commons-collections4:4.1'
A versão mais recente desta dependência pode ser encontradaon Maven Central.
3. Implementações e instanciação
O próprioBidiMap é apenas uma interface que define comportamentos exclusivos para um mapa bidirecional - e, é claro, há várias implementações disponíveis.
É importante entender que implementaçõesof BidiMap do not allow key and value duplicates. Quando umBidiMap é invertido, quaisquer valores duplicados serão convertidos em chaves duplicadas e violarão o contrato do mapa. Um mapa deve sempre ter chaves únicas.
Vejamos as diferentes implementações concretas desta interface:
-
DualHashBidiMap: esta implementação usa duas instâncias deHashMap para implementar o BidiMap internamente.. Ele fornece uma pesquisa rápida de entradas usando a chave ou o valor de uma entrada. No entanto, duas instâncias deHashMap devem ser mantidas
-
DualLinkedHashBidiMap: Esta implementação usa duas instâncias deLinkedHashMap e, conseqüentemente, mantém a ordem de inserção das entradas do mapa. Se não precisarmos que a ordem de inserção das entradas do mapa seja mantida, podemos apenas usar o menos caroDualHashBidiMap
-
TreeBidiMap: Esta implementação é eficiente e é realizada por uma implementação de árvore Red-Black. As chaves e valores deTreeBidiMap são classificados em ordem crescente usando a ordem natural das chaves e valores
-
Também háDualTreeBidiMap que usa duas instâncias deTreeMap para obter o mesmo queTreeBidiMap. DualTreeBidiMap é obviamente mais caro do queTreeBidiMap
A interfaceBidiMap estende a interfacejava.util.Map e, portanto, pode servir como uma substituição drop-in para ela. Podemos usar o construtor sem arg das implementações concretas para instanciar uma instância de objeto concreto.
4. MétodosBidiMap exclusivos
Agora que exploramos as diferentes implementações, vamos examinar os métodos que são exclusivos da interface.
Theput()inserts a new key-value entry into the map. Observe que, se o valor da nova entrada corresponder ao valor de qualquer entrada existente, a entrada existente será removida em favor da nova entrada.
O método retorna a entrada antiga removida ounull se não houver nenhuma:
BidiMap map = new DualHashBidiMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
assertEquals(map.size(), 2);
The inverseBidiMap() reverses the key-value pair of aBidiMap. Este método retorna um novoBidiMap onde as chaves se tornaram os valores e vice-versa. Esta operação pode ser muito útil em aplicativos de tradução e dicionário:
BidiMap rMap = map.inverseBidiMap();
assertTrue(rMap.containsKey("value1") && rMap.containsKey("value2"));
The removeValue() is used to remove a map entry by specifying a value, instead of a key. Esta é uma adição às implementações deMap encontradas no pacotejava.util:
map.removeValue("value2");
assertFalse(map.containsKey("key2"));
We can get the key mapped to a particular value in BidiMap with the getKey(). O método retornanull se nenhuma chave for mapeada para o valor especificado:
assertEquals(map.getKey("value1"), "key1");
5. Conclusão
Este tutorial rápido ofereceu uma olhada na biblioteca Apache Commons Collections - especificamente emBidiMap, suas implementações e métodos idiossincráticos.
O recurso mais interessante e distinto deBidiMap é sua capacidade de pesquisar e manipular entradas por meio de chaves e também de valores.
Como sempre, trechos de código estão disponíveisover on GitHub.