Em Java, existe um objeto que funciona como um mapa para armazenar e acessar pares de chave / valor, mas pode retornar uma lista ordenada de chaves e uma lista ordenada de valores, de modo que as listas de chaves e valores estejam na mesma ordem?
Portanto, como explicação por código, estou procurando algo que se comporte como meu OrderedMap fictício:
OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");
String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();
for(int i = 0; i < keys.size(); i++)
{
Integer key = keys.get(i);
String value = values.get(i);
Assert(om.get(key) == value);
}
java
collections
O que é isso
fonte
fonte
LinkedHashMap
.Respostas:
O SortedMap de interface (com a implementação TreeMap ) deve ser seu amigo.
A interface possui os métodos:
keySet()
que retorna um conjunto de chaves em ordem crescentevalues()
que retorna uma coleção de todos os valores na ordem crescente das chaves correspondentesPortanto, essa interface atende exatamente aos seus requisitos. No entanto, as chaves devem ter uma ordem significativa. Caso contrário, você pode usar o LinkedHashMap onde o pedido é determinado pelo pedido de inserção.
fonte
LinkedHashMap
cuja ordem de iteração é a ordem em que suas entradas foram acessadas pela última vezLinkedHashMap
, a ordem de iteração é a ordem de inserção, mas você pode usar um construtor diferente para especificar a ordem de acesso. docs.oracle.com/javase/8/docs/api/java/util/…Você está procurando java.util.LinkedHashMap . Você obterá uma lista dos pares Map.Entry <K, V> , que sempre são iterados na mesma ordem. Essa ordem é igual à ordem em que você coloca os itens. Como alternativa, use o java.util.SortedMap , onde as chaves devem ter uma ordem natural ou especificada por a
Comparator
.fonte
keySet()
método efetivamente retorna um LinkedHashSet que reflete a ordem das suasput()
chamadas. Observe que chamadas repetidasput()
para a mesma tecla não mudarão a ordem, a menos que vocêremove()
a tenha pressionado previamente.LinkedHashMap
cuja ordem de iteração é a ordem em que suas entradas foram acessadas pela última vezLinkedHashMap mantém a ordem das chaves.
java.util.LinkedHashMap parece funcionar como um HashMap normal, caso contrário.
fonte
Eu acho que a coleção mais próxima que você obterá do framework é o SortedMap
fonte
Você pode aproveitar a interface NavigableMap que pode ser acessada e atravessada em ordem crescente ou decrescente de chave. Essa interface pretende substituir a interface SortedMap. O mapa navegável geralmente é classificado de acordo com a ordem natural de suas chaves ou por um comparador fornecido no momento da criação do mapa.
Existem três implementações mais úteis: TreeMap , ImmutableSortedMap e ConcurrentSkipListMap .
Exemplo do TreeMap:
Resultado:
fonte
Eu acho que a interface SortedMap reforça o que você pede e o TreeMap implementa isso.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/SortedMap.html http://java.sun.com/j2se/1.5.0/docs/api/java/util /TreeMap.html
fonte
Desde o Java 6, também existe uma alternativa segura e sem bloqueio de threads para o TreeMap . Consulte ConcurrentSkipListMap .
fonte
tl; dr
Para manter
Map< Integer , String >
uma ordem classificada por chave, use uma das duas classes que implementam as interfacesSortedMap
/NavigableMap
:TreeMap
ConcurrentSkipListMap
Se estiver manipulando o mapa em um único encadeamento, use o primeiro
TreeMap
,. Se estiver manipulando threads, use o segundoConcurrentSkipListMap
,.Para detalhes, consulte a tabela abaixo e a discussão a seguir.
Detalhes
Aqui está uma tabela gráfica que eu criei mostrando os recursos das dez
Map
implementações incluídas no Java 11.A
NavigableMap
interface é o queSortedMap
deveria ter sido em primeiro lugar. ASortedMap
lógica deve ser removida, mas não pode ser, pois algumas implementações de mapas de terceiros podem estar usando a interface.Como você pode ver nesta tabela, apenas duas classes implementam as interfaces
SortedMap
/NavigableMap
:TreeMap
ConcurrentSkipListMap
Ambos mantêm as chaves na ordem classificada, por ordem natural (usando o
compareTo
método deComparable
( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ Comparable.html )) ou por umaComparator
implementação aprovada. A diferença entre essas duas classes é que a segunda ,,ConcurrentSkipListMap
é segura para threads , altamente simultânea .Consulte também a coluna Ordem de iteração na tabela abaixo.
LinkedHashMap
classe retorna suas entradas pela ordem em que foram originalmente inseridas .EnumMap
retorna entradas na ordem em que a classe enum da chave é definida . Por exemplo, um mapa de qual funcionário está cobrindo qual dia da semana (Map< DayOfWeek , Person >
) usa aDayOfWeek
classe enum incorporada ao Java. Essa enumeração é definida com segunda e domingo, primeiro. Portanto, as entradas em um iterador aparecerão nessa ordem.As outras seis implementações não prometem a ordem em que relatam suas entradas.
fonte
Eu usei o mapa Simple Hash, lista vinculada e coleções para classificar um mapa por valores.
A saída é:
fonte