Existe uma maneira elegante de obter apenas um Entry<K,V>
do HashMap, sem iterar, se a chave não for conhecida.
Como a ordem de entrada não é importante, podemos dizer algo como
hashMapObject.get(zeroth_index);
Embora eu esteja ciente de que não existe esse método get by index.
Se eu tentasse a abordagem mencionada abaixo, ainda seria necessário obter todo o conjunto de entradas do hashmap .
for(Map.Entry<String, String> entry : MapObj.entrySet()) {
return entry;
}
Sugestões são bem vindas.
Edição: Por favor, sugerir qualquer outra estrutura de dados para ser suficiente.
java
collections
nilesh
fonte
fonte
firstEntry()
método não está definido na interface,SortedMap
mas apenas emTreeMap
eConcurrentSkipListMap
:( #SortedMap
porque tinha ofirstKey()
método.Os mapas não são ordenados, portanto não existe a 'primeira entrada', e é também por isso que não existe um método de obtenção por índice em
Map
(ouHashMap
).Você poderia fazer isso:
(Nota: a verificação de um mapa vazio foi omitida).
Seu código não recebe todas as entradas no mapa, ele retorna imediatamente (e sai do loop) com a primeira entrada encontrada.
Para imprimir a chave e o valor desse primeiro elemento:
Nota: A chamada
iterator()
não significa que você está repetindo o mapa inteiro.fonte
LinkedHashMap
mantém as chaves na ordem em que foram inseridas.Map
implementações comoLinkedHashMap
eTreeMap
têm uma ordem definida. (HashMap
não).Eu acho que o iterador pode ser a solução mais simples.
Outra solução (não bonita):
Ou ainda (não melhor):
fonte
Obter valores, convertê-lo em uma matriz, obter o primeiro elemento da matriz:
W.
fonte
Por que você deseja evitar chamá-
entrySet()
lo geralmente não cria um objeto totalmente novo com seu próprio contexto, mas apenas fornece um objeto de fachada. Simplesmente falarentrySet()
é uma operação bem barata.fonte
Se você estiver usando o Java 8, é tão simples quanto findFirst () :
Exemplo rápido:
fonte
Se você realmente deseja a API sugerida, pode subclassificar o HashMap e acompanhar as chaves em uma Lista, por exemplo. Não vejo realmente o ponto disso, mas dá o que você deseja. Se você explicar o caso de uso pretendido, talvez possamos encontrar uma solução melhor.
EDIT: Eu deliberadamente não mergulhei no lado genérico disso ...
fonte
O que você quer dizer com "sem iterar"?
Você pode usar
map.entrySet().iterator().next()
e não itera pelo mapa (no sentido de "tocar em cada objeto"). Você não pode se apossar de umEntry<K, V>
sem usar um iterador. O Javadoc do Map.Entry diz:Você pode explicar com mais detalhes o que você está tentando realizar? Se você deseja manipular objetos primeiro, que correspondam a um critério específico (como "ter uma chave específica") e retornem aos objetos restantes, consulte um PriorityQueue . Ele ordenará seus objetos com base na ordem natural ou em uma definição personalizada
Comparator
que você fornecer.fonte
Essa abordagem não funciona porque você usou o HashMap. Presumo que o uso do LinkedHashMap seja a solução certa nesse caso.
fonte
Isso obteria uma única entrada do mapa, o mais próximo possível, dado que 'first' não se aplica.
fonte
Tropecei aqui procurando a mesma coisa ... Lembrei-me então da
Iterables
aula da biblioteca Guava .Para obter o "primeiro" elemento:
Iterables.getFirst( someMap.values(), null );
.Essencialmente, faz o mesmo que
Map.values().iterator().next()
, mas também permite que você especifique um padrão (neste caso, nulo), caso não exista nada no Mapa.Iterables.getLast( someMap.values(), null );
retorna o último elemento no mapa.Iterables.get( someMap.values(), 7, null );
retorna o sétimo elemento no mapa, se existir, caso contrário, um valor padrão (nesse caso, nulo).Lembre-se, porém, que os HashMaps não são solicitados ... portanto, não espere
Iterables.getFirst
devolver o primeiro item que você jogou lá ... da mesma formaIterables.getLast
. Talvez seja útil obter um valor mapeado.Pode não valer a pena adicionar a biblioteca Guava apenas para isso, mas se você estiver usando alguns dos outros utilitários legais dessa biblioteca ...
fonte
Após a sua edição, aqui está a minha sugestão:
Se você tiver apenas uma entrada, poderá substituir o Mapa por um objeto duplo. Dependendo dos tipos e de suas preferências:
fonte
fonte
Eu recebi a resposta: (É simples)
Pegue um ArrayList, depois faça o elenco e encontre o tamanho do arraylist. Aqui está :
Ele mostrará o tamanho. (Dê uma sugestão). Está funcionando.
fonte