HashMap - obtendo o valor da primeira chave


129

Abaixo estão os valores contidos no HashMap

statusName {Active=33, Renewals Completed=3, Application=15}

Código Java para obter a primeira chave (ou seja, ativa)

Object myKey = statusName.keySet().toArray()[0];

Como podemos coletar o primeiro "Valor" da chave (ou seja, 33), quero armazenar a "Chave" e o "Valor" em uma variável separada.


9
Você percebe que as HashMapentradas não estão ordenadas e, portanto, o "primeiro" pode mudar sempre que você modificar o mapa?
NPE

1
Você entende que não há uma ordem específica em um HashMap? Se você modificá-lo, poderá obter os resultados em uma ordem completamente diferente.
Jon Skeet,

Não, o pedido não é garantido de execução para execução, mas dentro do mesmo segmento, a ordem pode ser invocada.
hd1,

1
@JonSkeet Na verdade, essa é uma pergunta realmente válida. No Groovy, existem muitos casos em que você obtém uma estrutura que se parece com uma lista de mapas, cada mapa com uma única entrada. Até agora, não encontrei uma maneira fácil / óbvia (Groovy) de imprimir todos os valores. Se as chaves são constantes, é tão fácil quanto collection.each {println it.key} imprimir cada valor, mas sem chaves constantes não é óbvio, mas collection.each {println it.values ​​() [0]} funciona ( Um refinamento de algumas das respostas aqui ...).
Bill K de

@BillK: Se você sabe que cada mapa tem exatamente uma entrada, essa é uma pergunta diferente e que faz mais sentido.
Jon Skeet

Respostas:


251

Você pode tentar isto:

 Map<String,String> map = new HashMap<>();
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key = entry.getKey();
 String value = entry.getValue();

Lembre-se de HashMapque não garante o pedido de inserção. Use um LinkedHashMappara manter o pedido intacto.

Por exemplo:

 Map<String,String> map = new LinkedHashMap<>();
 map.put("Active","33");
 map.put("Renewals Completed","3");
 map.put("Application","15");
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key= entry.getKey();
 String value=entry.getValue();
 System.out.println(key);
 System.out.println(value);

Resultado:

 Active
 33

Eu sei que esta é uma resposta muito antiga .. isso está funcionando para hashmaps com chave e valor como strings. mas ao tentar o mesmo com um objeto para um erro de fundição de valor: com.google.gson.internal.LinkedTreeMap cannot be cast to...... minha classe que eu declarei em vez de Stringno lugar certo ... não consigo encontrar a resposta online
Blue Bot

@darthydarth você deve usar o tipo apropriado baseado em seu contexto.
Ruchira Gayan Ranaweera

primeiro super obrigado por responder! não estava esperando ... segundo eu, descobri que há um problema com os genéricos não salvos no tempo de execução. eventualmente, eu o cortei usando Gsonpara converter o objeto de valor em a Stringe, em seguida, analisei-o de volta para o meu tipo de classe. É feio, mas eu realmente não consegui encontrar nenhuma outra solução para algo que é tão fácil de fazer em outras linguagens (estou aprendendo Java agora)
Blue Bot

certo, mas como? é demais para a seção de comentários
Blue Bot

@darthydarth você pode me enviar um e-mail. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

Para obter o "primeiro" valor:

map.values().toArray()[0]

Para obter o valor da "primeira" chave:

map.get(map.keySet().toArray()[0])

Nota: o código acima foi testado e funciona.

Digo "primeiro" porque as entradas do HashMap não são ordenadas.

No entanto, um LinkedHashMap itera suas entradas na mesma ordem em que foram inseridas - você pode usar isso para a implementação do mapa se a ordem de inserção for importante.


primeiro você precisa verificar se o mapa não está vazio
ACV

48

Maneira de fazer Java 8,

String firstKey = map.keySet().stream().findFirst().get();


se tivermos a chave, recupere o primeiro valor usando map.get (firstKey). Apenas uma dica. :)
Upen

7

Você também pode tentar fazer isso para obter a primeira entrada inteira,

Map.Entry<String, String> entry = map.entrySet().stream().findFirst().get();
String key = entry.getKey();
String value = entry.getValue();

Isso para obter apenas a chave da primeira entrada,

String key = map.entrySet().stream().map(Map.Entry::getKey).findFirst().get();
// or better
String key = map.keySet().stream().findFirst().get();

Isso para obter apenas o valor da primeira entrada,

String value = map.entrySet().stream().map(Map.Entry::getValue).findFirst().get();
// or better
String value = map.values().stream().findFirst().get();

Além disso, caso você saiba o que está fazendo e deseja obter o segundo (o mesmo para o terceiro, etc.) item de um mapa, você deve tentar isso,

Map.Entry<String, String> entry = map.entrySet().stream().skip(1).findFirst().get();
String key = map.keySet().stream().skip(1).findFirst().get();
String value = map.values().stream().skip(1).findFirst().get();

4

como podemos coletar o primeiro "valor" chave (ou seja, 33)

Usando youMap.get(keyYouHave), você pode obter o valor disso.

deseja armazenar a "Chave" e o "Valor" em uma variável separada

Sim, você pode atribuir isso a uma variável.

Espere ... não acabou.

Se você (lógica de negócios) estiver dependendo da ordem de inserções e recuperação, verá resultados estranhos. O mapa não está ordenado, eles não armazenarão em um pedido. Esteja ciente desse fato. Use alguma alternativa para preservar seu pedido. Provavelmente umLinkedHashMap


2

Observe que você deve observar que seu fluxo lógico nunca deve depender do acesso aos HashMapelementos em alguma ordem, simplesmente coloque porque HashMaps não são ordenados Collections e não é isso que eles pretendem fazer. (Você pode ler mais sobre coleções odered e classific neste artigo ).

Voltando ao post, você já fez metade do trabalho carregando a primeira chave do elemento:

Object myKey = statusName.keySet().toArray()[0];

Basta ligar map.get(key)para obter o respectivo valor:

Object myValue = statusName.get(myKey);

1

Lembre-se de que a ordem de inserção não é respeitada em um mapa em geral. Experimente isto:

    /**
     * Get the first element of a map. A map doesn't guarantee the insertion order
     * @param map
     * @param <E>
     * @param <K>
     * @return
     */
    public static <E,K> K getFirstKeyValue(Map<E,K> map){
        K value = null;
        if(map != null && map.size() > 0){
            Map.Entry<E,K> entry =  map.entrySet().iterator().next();
            if(entry != null)
                value = entry.getValue();
        }
        return  value;
    }

Eu uso isso apenas quando tenho certeza disso map.size() == 1.


1

Melhorando a resposta de whoami. Como findFirst()retorna um Optional, é uma boa prática verificar se há um valor.

 var optional = pair.keySet().stream().findFirst();

 if (!optional.isPresent()) {
    return;
 }

 var key = optional.get();

Além disso, alguns comentaram que encontrar a primeira chave de a HashSetnão é confiável. Mas às vezes temos HashMappares; ou seja, em cada mapa temos uma chave e um valor. Nesses casos, é conveniente encontrar rapidamente a primeira chave desse par.


0

Também é uma boa maneira de fazer isso :)

Map<Integer,JsonObject> requestOutput = getRequestOutput(client,post);
int statusCode = requestOutput.keySet().stream().findFirst().orElseThrow(() -> new RuntimeException("Empty"));

-2

Você também pode tentar abaixo:

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);

1
Esse método não existe
Adrian Grygutis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.