Отримайте ключі від HashMap на Java


166

У мене на Java такий хешмап:

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

Потім я заповнюю це так:

team1.put("United", 5);

Як я можу отримати ключі? Щось на кшталт: team1.getKey()повернути "Юнайтед".


Що ви очікуєте team1.getKey()повернути, якщо: (1) карта порожня, або (2), якщо вона містить кілька клавіш?
NPE

intслід використовувати для одинакових подібних.
stommestack

Відповіді:


312

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 ()?
маска

Ні у вас немає карти з одним елементом. Але це карта: структура, яка може містити більше одного елемента.
Маттео

13
Що означає карта з одним ключем? Створіть клас із ключовим полем та полем значення.
JB Nizet

Я неправильно зрозумів свою проблему. Дякую за відповіді
маска

3
Якщо ви хочете зберегти всі ключі у списку масивів:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani

50

Це можливо зробити, принаймні теоретично, якщо ви знаєте індекс:

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

keySet() повертає набір, тож ви перетворюєте набір у масив.

Проблема, звичайно, полягає в тому, що набір не обіцяє зберегти ваше замовлення. Якщо у вас є лише один предмет у вашому HashMap, ви добре, але якщо у вас є більше, краще перенести на карту, як це робили інші відповіді.


Це корисно в сценарії тестування одиниць, коли ви маєте повний контроль над вмістом свого HashMap. Гарне шоу.
підйомTide

Нічого про знання індексу у питанні.
Маркіз Лорн

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's Commons - також пам’ятайте, що кілька різних ключів можуть бути відображені в одне значення.



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

Тепер у ключах будуть усі ваші ключі, наявні в карті. напр .: [key1, key2]


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.