O que você quer dizer com "posição"? HashMaps não são ordenados, portanto, eles não têm a noção usual de "posição" que você obteria com algo como um vetor.
Mat,
1
Você quer dizer com seu pedido de inserção ou algum outro pedido?
Isso realmente não responde à pergunta. As outras respostas abaixo são mais úteis.
forresthopkinsa
6
Com todo respeito, cita documentação que responde diretamente à pergunta
Wayne
1
Mesmo que a ordem não seja constante ao longo do tempo, ainda pode ser possível recuperar um dos membros por uma determinada posição.
Principiante de
Eu não sigo. Explicar?
Wayne
O link HashMap está quebrado / 404.
Raf
109
Use um LinkedHashMap e quando precisar recuperar por posição, converta os valores em um ArrayList.
LinkedHashMap<String,String> linkedHashMap =newLinkedHashMap<String,String>();/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");/* Get by position */int pos =1;String value =(newArrayList<String>(linkedHashMap.values())).get(pos);
Mais simples, devo dizer ... Em vez de converter tudo, você está usando apenas o conjunto de chaves. Excelente
kirtan403
19
Se você, por algum motivo, tiver que ficar com o hashMap, poderá converter o keySet em uma matriz e indexar as chaves na matriz para obter os valores no mapa da seguinte maneira:
Implementação de tabela de hash e lista vinculada da interface Map, com ordem de iteração previsível. Essa implementação difere do HashMap porque mantém uma lista duplamente vinculada em todas as suas entradas.
Estou supondo que por 'posição' você está se referindo à ordem em que inseriu os elementos no HashMap. Nesse caso, você deseja usar um LinkedHashMap. O LinkedHashMap não oferece um método de acessador; você precisará escrever um like
Outra abordagem de trabalho é transformar os valores do mapa em uma matriz e, em seguida, recuperar o elemento no índice. A execução de teste de 100.000 elementos por pesquisas de índice em LinkedHashMap de 100.000 objetos usando as seguintes abordagens levou aos seguintes resultados:
//My answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.values().toArray(newParticle[map.values().size()])[index];}//68 965 ms//Syd Lambert's answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.get((map.keySet().toArray())[ index ]);}//80 700 ms
Resumindo, recuperar elemento por índice de LinkedHashMap parece ser uma operação bastante pesada.
HashMap - e a estrutura de dados subjacente - tabelas de hash, não têm uma noção de posição. Ao contrário de LinkedList ou Vector, a chave de entrada é transformada em um 'balde' onde o valor é armazenado. Esses depósitos não são ordenados de uma forma que faça sentido fora da interface HashMap e, como tal, os itens que você coloca no HashMap não estão em ordem no sentido que você esperaria com outras estruturas de dados
HashMaps não permitem acesso por posição, ele só conhece o código hash e pode recuperar o valor se puder calcular o código hash da chave. TreeMaps tem uma noção de ordenação. Os mapas do Linkedhas preservam a ordem em que entraram no mapa.
Respostas:
HashMaps não preservam a ordem:
Dê uma olhada em LinkedHashMap , que garante uma ordem de iteração previsível.
fonte
Use um LinkedHashMap e quando precisar recuperar por posição, converta os valores em um ArrayList.
fonte
Se você deseja manter a ordem em que adicionou os elementos ao mapa, use
LinkedHashMap
em vez de apenasHashMap
.Aqui está uma abordagem que permitirá que você obtenha um valor por seu índice no mapa:
fonte
Se você, por algum motivo, tiver que ficar com o hashMap, poderá converter o keySet em uma matriz e indexar as chaves na matriz para obter os valores no mapa da seguinte maneira:
Você pode acessar o mapa como:
fonte
String myKey = keys[i].toString();
Use
LinkedHashMap
:fonte
Use LinkedHashMap e use esta função.
Defina assim e.
A função pode retornar a entrada selecionada.
fonte
Estou supondo que por 'posição' você está se referindo à ordem em que inseriu os elementos no HashMap. Nesse caso, você deseja usar um LinkedHashMap. O LinkedHashMap não oferece um método de acessador; você precisará escrever um like
fonte
Outra abordagem de trabalho é transformar os valores do mapa em uma matriz e, em seguida, recuperar o elemento no índice. A execução de teste de 100.000 elementos por pesquisas de índice em LinkedHashMap de 100.000 objetos usando as seguintes abordagens levou aos seguintes resultados:
Resumindo, recuperar elemento por índice de LinkedHashMap parece ser uma operação bastante pesada.
fonte
HashMap - e a estrutura de dados subjacente - tabelas de hash, não têm uma noção de posição. Ao contrário de LinkedList ou Vector, a chave de entrada é transformada em um 'balde' onde o valor é armazenado. Esses depósitos não são ordenados de uma forma que faça sentido fora da interface HashMap e, como tal, os itens que você coloca no HashMap não estão em ordem no sentido que você esperaria com outras estruturas de dados
fonte
O HashMap não tem conceito de posição, portanto, não há como obter um objeto por posição. Os objetos no Maps são definidos e obtidos por teclas.
fonte
você pode usar o código abaixo para obter a chave:
String [] keys = (String[]) item.keySet().toArray(new String[0]);
e obter o objeto ou lista que se insere no HashMap com a chave deste item assim:
item.get(keys[position]);
fonte
Por padrão, java LinkedHasMap não suporta a obtenção de valor por posição. Então, eu sugiro ir com personalizado
IndexedLinkedHashMap
Então você pode usar este LinkedHasMap personalizado como
PARA adicionar valores
Para obter o valor por índice
fonte
HashMaps não permitem acesso por posição, ele só conhece o código hash e pode recuperar o valor se puder calcular o código hash da chave. TreeMaps tem uma noção de ordenação. Os mapas do Linkedhas preservam a ordem em que entraram no mapa.
fonte
Você pode tentar implementar algo assim, observe:
Espero que isso funcione pra você.
fonte