Получить ключи из HashMap в Java


167

У меня есть Hashmap в Java, как это:

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

Тогда я заполняю это так:

team1.put("United", 5);

Как я могу получить ключи? Что-то вроде: team1.getKey()вернуть «Юнайтед».


Что вы ожидаете team1.getKey()вернуть, если: (1) карта пуста или (2) если она содержит несколько ключей?
NPE

intследует использовать для одиноких, как это.
Stommestack

Ответы:


313

A HashMapсодержит более одного ключа. Вы можете использовать, keySet()чтобы получить набор всех ключей.

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

будет хранить 1с ключом "foo"и 2с ключом "bar". Чтобы перебрать все ключи:

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

распечатает "foo"и "bar".


Но в этом случае у меня есть только один ключ для каждого значения. Не возможно написать что-нибудь вроде team1.getKey ()?
Masb

Нет, у вас есть карта с одним элементом. Но это карта: структура, которая может содержать более одного элемента.
Маттео

13
Какой смысл карты с одним ключом? Создайте класс с ключевым полем и полем значения.
Дж. Б. Низет

Я неправильно понял мою проблему. Спасибо за ваши ответы.
Маска

3
Если вы хотите сохранить все ключи в списке массивов:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani

50

Это выполнимо, по крайней мере в теории, если вы знаете индекс:

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

keySet() возвращает набор, поэтому вы конвертируете набор в массив.

Проблема, конечно, в том, что набор не обещает сохранить ваш заказ. Если у вас есть только один элемент в вашей HashMap, вы хорошо, но если у вас есть больше, лучше перебрать карту, как это сделали другие ответы.


Это полезно в сценарии модульного тестирования, где у вас есть полный контроль над содержимым вашего HashMap. Хорошее шоу.
восход прилив

Ничего о знании индекса в вопросе.
маркиз Лорн

23

Проверь это.

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

(Используйте, java.util.Objects.equalsпотому что HashMap может содержать null)

Использование 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());
}

Более "универсальный" и максимально безопасный

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

Или если вы на 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
Но что произойдет, если несколько ключей отображаются на одно и то же значение? вместо этого вам следует возвращать список ключей
Оскар Лопес

@ ÓscarLópez Они не могут. HashMapключи уникальны.
маркиз Лорн

6

Вы можете получить все Mapключи, используя метод keySet(). Теперь, если вам нужно получить ключ с учетом его значения , это совершенно другой вопрос, и Mapон вам там не поможет; вам потребуется специальная структура данных, например BidiMap(карта, которая позволяет осуществлять двунаправленный поиск между ключом и значениями) из коллекций Apache Commons Collections, - также следует помнить, что несколько разных ключей могут быть сопоставлены одному и тому же значению.


1

Поскольку вы хотели бы получить аргумент ( United), для которого задано значение ( 5), вы также можете рассмотреть возможность использования двунаправленной карты (например, предоставленной Guava: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google /common/collect/BiMap.html ).


1

Если вам просто нужно что-то простое и больше проверки.

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

Тогда вы можете искать любой ключ.

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

1
Этот метод полностью избыточен.
маркиз Лорн

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

Не работает Очевидно, вы не пробовали это. Вызов next()дважды в цикле означает, что вы распечатаете нечетные ключи вместе с четными значениями.
маркиз Лорн

0

Используйте функциональную операцию для более быстрой итерации.

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


-1

Решением может быть, если вы знаете позицию ключа, преобразовать ключи в массив String и вернуть значение в позиции:

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

    return keys[pos];
}

Ничего о знании индекса в вопросе.
маркиз Лорн

-2

Попробуйте эту простую программу:

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

Просто копирует существующие ответы. -1
james.garriss

-2

Чтобы получить ключи в HashMap, у нас есть метод keySet (), который присутствует в java.util.Hashmapпакете. пример:

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

Теперь ключи будут иметь все ваши ключи доступны на карте. например: [ключ1, ключ2]


java,util.HashMapэто класс, а не пакет, и здесь нет ничего, чего не было бы пять лет назад.
маркиз Лорн

-3

То, что я сделаю, что очень просто, но тратит память, - это сопоставить значения с ключом и сделать противоположное, чтобы сопоставить ключи со значением, создающим это:

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

важно, чтобы вы использовали, <Object, Object>чтобы вы могли отобразить keys:Valueи Value:Keysнравится это

team1.put("United", 5);

team1.put(5, "United");

Так что если вы используете team1.get("United") = 5иteam1.get(5) = "United"

Но если вы используете какой-то конкретный метод для одного из объектов в парах, мне будет лучше, если вы создадите другую карту:

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

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

а потом

team1.put("United", 5);

team1Keys.put(5, "United");

и помни, будь проще;)


-3

Получить ключ и его значение

например

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
                }

Напечатает: Ключ: Единое значение: 5 Ключ: Барселона Значение: 6

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.