Obter chaves do HashMap em Java


167

Eu tenho um Hashmap em Java como este:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

Então eu preencho assim:

team1.put("United", 5);

Como posso obter as chaves? Algo como: team1.getKey()retornar "United".


O que você espera team1.getKey()retornar se: (1) o mapa estiver vazio ou (2) se ele contiver várias chaves?
NPE

intdeve ser usado para os únicos como este.
Stommestack

Respostas:


313

A HashMapcontém mais de uma chave. Você pode usar keySet()para obter o conjunto de todas as chaves.

team1.put("foo", 1);
team1.put("bar", 2);

irá armazenar 1com chave "foo"e 2com chave "bar". Para iterar sobre todas as chaves:

for ( String key : team1.keySet() ) {
    System.out.println( key );
}

irá imprimir "foo"e "bar".


Mas, neste caso, eu tenho apenas uma chave para cada valor. Não é possível escrever algo como team1.getKey ()?
MASB

Não, você tem um mapa com um elemento. Mas é um mapa: uma estrutura que pode conter mais de um elemento.
Matteo

13
Qual é o sentido de um mapa com uma única chave? Crie uma classe com um campo-chave e um campo de valor.
JB Nizet

Eu não entendi meu problema. Obrigado por suas respostas.
Masb 5/05

3
Se você deseja armazenar todas as chaves na lista de matrizes:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani

50

Isso é possível, pelo menos em teoria, se você souber o índice:

System.out.println(team1.keySet().toArray()[0]);

keySet() retorna um conjunto, para que você converta o conjunto em uma matriz.

O problema, é claro, é que um conjunto não promete manter seu pedido. Se você possui apenas um item no seu HashMap, é bom, mas se tiver mais do que isso, é melhor percorrer o mapa, como outras respostas.


Isso é útil em um cenário de teste de unidade em que você tem controle total sobre o conteúdo do seu HashMap. Bom show.
risingTide

Nada sobre conhecer o índice na pergunta.
Marquês de Lorne

23

Verifique isso.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

(Use java.util.Objects.equalsporque o HashMap pode conter null)

Usando JDK8 +

/**
 * Find any key matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return Any key matching the value in the team.
 */
private Optional<String> getKey(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .findAny();
}

/**
 * Find all keys matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return all keys matching the value in the team.
 */
private List<String> getKeys(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
}

Mais "genérico" e o mais seguro possível

/**
 * Find any key matching the value, in the given map.
 *
 * @param mapOrNull Any map, null is considered a valid value.
 * @param value     The value to be searched.
 * @param <K>       Type of the key.
 * @param <T>       Type of the value.
 * @return An optional containing a key, if found.
 */
public static <K, T> Optional<K> getKey(Map<K, T> mapOrNull, T value) {
    return Optional.ofNullable(mapOrNull).flatMap(map -> map.entrySet()
            .stream()
            .filter(e -> Objects.equals(e.getValue(), value))
            .map(Map.Entry::getKey)
            .findAny());
}

Ou se você estiver no JDK7.

private String getKey(Integer value){
    for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
            return key; //return the first found
        }
    }
    return null;
}

private List<String> getKeys(Integer value){
   List<String> keys = new ArrayList<String>();
   for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
             keys.add(key);
      }
   }
   return keys;
}

2
Mas o que acontece se várias chaves são mapeadas para o mesmo valor? você deveria retornar uma lista de chaves
Óscar López

@ ÓscarLópez Eles não podem. HashMapchaves são únicas.
Marquês de Lorne

6

Você pode recuperar todas as Mapchaves 's usando o método keySet(). Agora, se o que você precisa é obter uma chave devido ao seu valor , isso é uma questão completamente diferente e Mapnão o ajudará lá; você precisaria de uma estrutura de dados especializada, como BidiMap(um mapa que permita a pesquisa bidirecional entre chave e valores) da Apache's Commons Collections - também esteja ciente de que várias chaves diferentes podem ser mapeadas para o mesmo valor.



1

Se você só precisa de algo simples e mais de uma verificação.

public String getKey(String key)
{
    if(map.containsKey(key)
    {
        return key;
    }
    return null;
}

Então você pode procurar por qualquer chave.

System.out.println( "Does this key exist? : " + getKey("United") );

1
Este método é totalmente redundante.
Marquês de Lorne

1
private Map<String, Integer> _map= new HashMap<String, Integer>();
Iterator<Map.Entry<String,Integer>> itr=  _map.entrySet().iterator();
                //please check 
                while(itr.hasNext())
                {
                    System.out.println("key of : "+itr.next().getKey()+" value of      Map"+itr.next().getValue());
                }

Não funciona Claramente você não tentou. Ligar next()duas vezes no loop significa que você imprimirá as teclas com números ímpares junto com os valores pares.
Marquês de Lorne

0

Use a operação funcional para uma iteração mais rápida.

team1.keySet().forEach((key) -> { System.out.println(key); });


-1

Uma solução pode ser, se você souber a posição da chave, converter as chaves em uma matriz String e retornar o valor na posição:

public String getKey(int pos, Map map) {
    String[] keys = (String[]) map.keySet().toArray(new String[0]);

    return keys[pos];
}

Nada sobre conhecer o índice na pergunta.
Marquês de Lorne

-2

Experimente este programa simples:

public class HashMapGetKey {

public static void main(String args[]) {

      // create hash map

       HashMap map = new HashMap();

      // populate hash map

      map.put(1, "one");
      map.put(2, "two");
      map.put(3, "three");
      map.put(4, "four");

      // get keyset value from map

Set keyset=map.keySet();

      // check key set values

      System.out.println("Key set values are: " + keyset);
   }    
}

-2
public class MyHashMapKeys {

    public static void main(String a[]){
        HashMap<String, String> hm = new HashMap<String, String>();
        //add key-value pair to hashmap
        hm.put("first", "FIRST INSERTED");
        hm.put("second", "SECOND INSERTED");
        hm.put("third","THIRD INSERTED");
        System.out.println(hm);
        Set<String> keys = hm.keySet();
        for(String key: keys){
            System.out.println(key);
        }
    }
}

Apenas copia as respostas existentes. -1
james.garriss 30/11/2015

-2

Para obter chaves no HashMap, temos o método keySet () que está presente no java.util.Hashmappacote. ex:

Map<String,String> map = new Hashmap<String,String>();
map.put("key1","value1");
map.put("key2","value2");

// Now to get keys we can use keySet() on map object
Set<String> keys = map.keySet();

Agora, as chaves terão todas as suas chaves disponíveis no mapa. ex: [tecla1, tecla2]


java,util.HashMapé uma classe, não um pacote, e não há nada aqui que não estivesse aqui cinco anos atrás.
Marquês de Lorne

-3

O que vou fazer é muito simples, mas desperdiçar memória é mapear os valores com uma chave e fazer o contrário para mapear as chaves com um valor que faz isso:

private Map<Object, Object> team1 = new HashMap<Object, Object>();

é importante que você use <Object, Object>para que você possa mapear keys:Valuee Value:Keysassim

team1.put("United", 5);

team1.put(5, "United");

Então, se você usar team1.get("United") = 5eteam1.get(5) = "United"

Mas se você usar algum método específico em um dos objetos nos pares, será melhor se você fizer outro mapa:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

private Map<Integer, String> team1Keys = new HashMap<Integer, String>();

e depois

team1.put("United", 5);

team1Keys.put(5, "United");

e lembre-se, mantenha-o simples;)


-3

Para obter Key e seu valor

por exemplo

private Map<String, Integer> team1 = new HashMap<String, Integer>();
  team1.put("United", 5);
  team1.put("Barcelona", 6);
    for (String key:team1.keySet()){
                     System.out.println("Key:" + key +" Value:" + team1.get(key)+" Count:"+Collections.frequency(team1, key));// Get Key and value and count
                }

Irá imprimir: Chave: United Valor: 5 Chave: Barcelona Valor: 6

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.