Java hashmap получение ключа по значению

Java: How to get all keys by a value in HashMap ? | Search by Value in Map

In this article we will discuss how to search into a Map by value and fetch associated keys to the given value.

Suppose we have a map of string and integers i.e.

HashMap mapOfWords = new HashMap() < < put("John", 25); put("at", 2); put("from", 10); put("is", 5); put("the", 2); put("hello", 1); put("break", 25); >>;

Now we want to get all the keys whose value is 2 i.e. the & at. Let’s see How to do that,

Get Keys by Value in Map

To fetch the keys associated by given value, follow these steps,

Frequently Asked:

  • First Check if given value exists in map using containsValue() function. If yes then,
  • Iterate over a given Map and for each Entry check if value matches the given value, if yes then store its key in the list.
Читайте также:  Python lowercase first letter

Generic solution that will work with every map i.e. HashMap, TreeMap etc.

static List getAllKeysForValue(Map mapOfWords, V value) < ListlistOfKeys = null; //Check if Map contains the given value if(mapOfWords.containsValue(value)) < // Create an Empty List listOfKeys = new ArrayList<>(); // Iterate over each entry of map using entrySet for (Map.Entry entry : mapOfWords.entrySet()) < // Check if value matches with given value if (entry.getValue().equals(value)) < // Store the key from entry to the list listOfKeys.add(entry.getKey()); >> > // Return the list of keys whose value matches with given value. return listOfKeys; >

Complete example is as follows,

package com.thispointer.java.hashmap.examples; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MapUtilities < /* * Get the all the keys associated with given Value V from map */ static List getAllKeysForValue(Map mapOfWords, V value) < ListlistOfKeys = null; //Check if Map contains the given value if(mapOfWords.containsValue(value)) < // Create an Empty List listOfKeys = new ArrayList<>(); // Iterate over each entry of map using entrySet for (Map.Entry entry : mapOfWords.entrySet()) < // Check if value matches with given value if (entry.getValue().equals(value)) < // Store the key from entry to the list listOfKeys.add(entry.getKey()); >> > // Return the list of keys whose value matches with given value. return listOfKeys; > public static void main(String[] args) < // Create a Map of words and thier frequency count HashMapmapOfWords = new HashMap() < < put("John", 25); put("at", 2); put("from", 10); put("is", 5); put("the", 2); put("hello", 1); put("break", 25); >>; //Get the list of keys whose value matches with given value. List listOfKeys = MapUtilities.getAllKeysForValue(mapOfWords, 2); System.out.println(listOfKeys); > >

Источник

Получить ключ из значения на карте Java

В этом посте будет обсуждаться, как получить ключ карты из значения в Java, где существует отношение 1:1 между ключами и значениями в карте, т. е. никакие два ключа не имеют одинакового значения.

Читайте также:  Что такое sitemap php

1. Использование entrySet() метод

Идея состоит в том, чтобы перебрать все сопоставления, присутствующие на карте, с помощью entrySet() метод и сравниваем каждое значение с желаемым значением, пока не получим соответствующий ключ.

Из Java 8 мы можем использовать Stream:

2. Использование keySet() метод

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

Из Java 8 мы можем использовать Stream:

3. Использование обратной карты

Идея состоит в том, чтобы расширить HashMap класс и перегрузить его put() таким образом, что он также вставляет пару ключ-значение в обратную карту вместе с парой ключ-значение в исходной карте. Мы также создаем getKey() метод, облегчающий поиск значения в обратной карте.

4. Использование Guava BiMap Class

Guava обеспечивает BiMap класс, двунаправленная карта для обеспечения обратного представления отображений, т. е. с перевернутыми ключами и значениями. BiMap не допускает повторяющихся значений и бросков IllegalArgumentException при обнаружении нескольких записей с одинаковым значением. Чтобы получить обратную картину BiMap , мы можем использовать inverse() метод.

Источник

Java HashMap Get Key from Value Example

This example shows how to get the HashMap key from the value. The example also shows how to get all keys using the value in case the value is mapped to multiple keys of the HashMap object.

How to get key using the value of the HashMap?

The HashMap class is a map implementation that maps keys with values. If you want to get HashMap value using a key, you can use the get method and provide the key for which you want to fetch the value. But what if you want to get key from a value?

The HashMap class does not provide any direct method to get a key from value because it is not built for that purpose. However, there are several ways using which you can do that as given below.

1. Using the keySet method and a for loop (1:1 relationship)

This approach gets all the keys using the HashMap keySet method and iterates over them. If the value mapped to any key is matching with the value for which we want to get the key, it returns the key.

2. Using the entrySet method and a for loop (1:1 relationship)

This approach is similar to the above given approach, but instead of the keys, it fetches the HashMap entries using the entrySet method. You can also use an Iterator instead of the for loop.

3. Using a custom HashMap class (1:1 relationship)

The above two approaches use the built-in methods of the HashMap class to get the HashMap key from the value. This approach creates a custom class that extends the HashMap class having a separate map object which maintains the value to key mappings. It also defines a method to get a key from value as given below.

What about HashMap having the same values mapped to multiple keys?

All the above example works for HashMap that has 1:1 relationship between keys and values. However, the HashMap class allows the same value being mapped to multiple keys. If that is the case, you can use the below given method to get a list of all keys mapped to a particular value.

If the value is mapped to multiple keys in the HashMap, the above method returns a list object containing all the keys. If the value is not mapped to any key, it returns an empty list.

The bad:

Approach 1 and 2 iterates over the HashMap object to find a key mapped to the given value. It is a slow operation in terms of performance especially if the map is large.

Approach 3 creates a custom class by extending the built-in HashMap class. But it needs double the memory because it also needs to maintain the reverse mappings of value to key. Also, removing any element from the map does not remove the corresponding mapping from the reverse map.

The bi-directional maps:

If you are already using the Apache Commons library in your project, you should use the data structure specifically built for this purpose i.e. bi-directional map implementation. As the name suggests, it maintains the mapping in both directions i.e. key to value and value to key.

Источник

Извлечение ключа из HashMap в Java по заданному значению

Работа с коллекциями данных — это распространенная задача в программировании на Java. Одним из самых часто используемых типов коллекций является HashMap . HashMap в Java — это структура данных, которая позволяет хранить пары «ключ-значение». Основное преимущество HashMap заключается в том, что она обеспечивает быстрый доступ к значениям по ключам.

Однако иногда возникает ситуация, когда у вас есть значение, и вам нужно найти соответствующий ключ в HashMap . Допустим, у нас есть HashMap map , в которой хранятся данные вида «имя-фамилия», и нам нужно найти имя человека по его фамилии.

HashMap<String, String> map = new HashMap<>(); map.put("John", "Doe"); map.put("Jane", "Doe");

В этом случае мы знаем фамилию («Doe»), и нам нужно найти соответствующее имя.

К сожалению, HashMap в Java не предоставляет прямого метода для получения ключа по значению. Это связано с тем, что HashMap предназначена для быстрого поиска значений по ключам, а не наоборот.

Однако это не означает, что мы не можем получить ключ по значению. Просто нам придется воспользоваться итерацией по мапе.

String surname = "Doe"; String name = null; for (Map.Entry<String, String> entry : map.entrySet()) < if (entry.getValue().equals(surname)) < name = entry.getKey(); break; >>

В этом примере мы используем цикл for-each для итерации по всей HashMap . Мы проверяем каждое значение, и когда находим нужное, извлекаем соответствующий ключ и прерываем цикл.

Несмотря на то, что этот метод работает, он является неэффективным, если HashMap содержит большое количество элементов, поскольку в худшем случае нам придется пройти через все элементы.

Если вам часто приходится получать ключ по значению, возможно, стоит рассмотреть использование другой структуры данных, которая лучше подходит для таких операций, например BiMap из Google Guava.

Источник

Java hashmap получение ключа по значению

“Анна Ивановна Решетникова, 4211 717171” И как они собирались хранить такой номер паспорта в типе Integer? Тем самым показав, что номер паспорта хранить в базе данных как число — это не лучшая идея. Так как номера паспорта могут содержать дефисы, пробелы, буквы и т.д. Поправьте меня, если я не прав. Иначе у меня вопросы к господину Милану.

Скажите, почему хронология вывода на экран поменялась?

Получение списка всех ключей и значений Еще одна удобная особенность HashMap — можно по-отдельности получить список всех ключей и всех значений. Для этого используются методы keySet() и values() Для чего в примере создаются Set и ArrayList? Если в sout можно прямо вызвать методы keySet() и values()?

Возможно ли в HashMap переопределить метод toString() и если да, то каким образом? P/S: Спросил нынче модный ChatGPT, так он какую-то чушь городит: то пишет можно и даёт нерабочие коды, каждый раз разные, то пишет что нельзя потому что HashMap происходит от абстрактного класса. Хотя я уже понял что верить ему нельзя во всем, на вопрос можно ли реализовать в Java множественное наследование (не через интерфейсы) он бодро рапортовал, что конечно можно и вывалил код типа public сlass A extends B, C, который естественно не работает. Извините за возможный оффтоп. Так что роботы пока не завоюют мир, поэтому, вопрос по toString() все еще актуален. )

Источник

Оцените статью