Obtenga claves de HashMap en Java

167

Tengo un Hashmap en Java como este:

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

Luego lo lleno así:

team1.put("United", 5);

¿Cómo puedo obtener las llaves? Algo así como: team1.getKey()volver "Unidos".

masb
fuente
¿Qué espera team1.getKey()devolver si: (1) el mapa está vacío o (2) si contiene varias claves?
NPE
intdebe usarse para solteros como este.
stommestack

Respuestas:

313

UNA HashMap contiene más de una clave. Puede usar keySet()para obtener el conjunto de todas las claves.

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

se almacenará 1con llave "foo"y2 con llave "bar". Para iterar sobre todas las claves:

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

imprimirá "foo"y "bar".

Matteo
fuente
Pero en este caso solo tengo una clave para cada valor. No es posible escribir algo como team1.getKey ()?
masb
No, tienes un mapa con un elemento. Pero es un mapa: una estructura que puede contener más de un elemento.
Matteo
13
¿Cuál es el punto de un mapa con una sola clave? Cree una clase con un campo clave y un campo de valor.
JB Nizet
No entendí mi problema. Gracias por tus respuestas.
masb
3
Si desea almacenar todas las claves en la lista de matriz:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani
50

Esto es factible, al menos en teoría, si conoce el índice:

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

keySet() devuelve un conjunto, por lo que convierte el conjunto en una matriz.

El problema, por supuesto, es que un conjunto no promete mantener su pedido. Si solo tiene un elemento en su HashMap, es bueno, pero si tiene más que eso, es mejor recorrer el mapa, como lo han hecho otras respuestas.

james.garriss
fuente
Esto es útil en un escenario de prueba de unidad donde tiene control total sobre el contenido de su HashMap. Buen espectaculo.
risingTide
Nada sobre saber el índice en la pregunta.
Marqués de Lorne
23

Mira esto.

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

(Úselo java.util.Objects.equalsporque HashMap puede contenernull )

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());
}

Más "genérico" y lo más seguro posible

/**
 * 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());
}

O si estás en 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;
}
Fabio F.
fuente
2
Pero, ¿qué sucede si varias teclas se asignan al mismo valor? deberías devolver una lista de llaves en su lugar
Óscar López
@ ÓscarLópez No pueden. HashMapLas llaves son únicas.
Marqués de Lorne
6

Puede recuperar toda la Mapllaves 's utilizando el método keySet(). Ahora, si lo que necesita es obtener una clave dado su valor , ese es un asunto completamente diferente y Mapno lo ayudará allí; necesitaría una estructura de datos especializada, comoBidiMap (un mapa que permita la búsqueda bidireccional entre clave y valores) de las Colecciones de Apache's Commons , también tenga en cuenta que varias claves diferentes podrían asignarse al mismo valor.

Óscar López
fuente
1

Si solo necesita algo simple y más de una verificación.

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

Luego puede buscar cualquier clave.

System.out.println( "Does this key exist? : " + getKey("United") );
tzg
fuente
1
Este método es 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());
                }
sachin
fuente
No funciona Claramente no lo has probado. Llamar next()dos veces en el ciclo significa que imprimirá las teclas impares junto con los valores pares.
Marqués de Lorne
0

Utilice la operación funcional para una iteración más rápida.

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

eCuzzy
fuente
-1

Una solución puede ser, si conoce la posición de la clave, convertir las claves en una matriz de cadenas y devolver el valor en la posición:

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

    return keys[pos];
}
Orici
fuente
Nada sobre saber el índice en la pregunta.
Marqués de Lorne
-2

Prueba este sencillo programa:

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);
   }    
}
raman rayat
fuente
-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);
        }
    }
}
Abdul Rizwan
fuente
Simplemente copia las respuestas existentes. -1
james.garriss
-2

Para obtener claves en HashMap, tenemos el método keySet () que está presente en el java.util.Hashmappaquete. 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();

Ahora las claves tendrán todas sus claves disponibles en el mapa. ej .: [clave1, clave2]

ghanshyam singh
fuente
java,util.HashMapes una clase, no un paquete, y no hay nada aquí que no estuviera aquí hace cinco años.
Marqués de Lorne
-3

Lo que haré es muy simple pero desperdiciar memoria es mapear los valores con una clave y hacer lo contrario para mapear las claves con un valor haciendo esto:

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

es importante que use <Object, Object>para poder mapear keys:Valuey Value:Keysasí

team1.put("United", 5);

team1.put(5, "United");

Entonces si usas team1.get("United") = 5 yteam1.get(5) = "United"

Pero si usas algún método específico en uno de los objetos en los pares, seré mejor si haces otro mapa:

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

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

y entonces

team1.put("United", 5);

team1Keys.put(5, "United");

y recuerda, mantenlo simple;)

usuario3763927
fuente
-3

Para obtener clave y su valor

p.ej

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
                }

Imprimirá: Clave: United Valor: 5 Clave: Barcelona Valor: 6

Emmanuel R
fuente