2015-09-22 3 views
2

В настоящее время я работаю над Data Structures для написания программы по шифрованию и расшифровке имен. У меня есть сомнения в интерфейсе карты. Фактически для получения значения, связанного с ключом, у нас есть метод get() в интерфейсе карты. Но как получить ключ от конкретного значения без перебора всех пар ключ-значение в интерфейсе MapКак получить ключ на основе значения в интерфейсе карты Java?

Спасибо

+0

может кто-нибудь, пожалуйста, рекомендовать мне структуру данных, через которую я могу решить мою проблему? на самом деле я пробовал использовать интерфейс ввода, но я не получаю его – Srividya

+0

, что именно вы пытаетесь сделать? –

ответ

0

Ну как все говорят, что вы не можете сделать это в приличном образом, потому что может быть повторяющиеся значения. Вы можете найти хит с помощью метода equals() и сравнить значения. но опять же, почему вы даже используете карту key/value, если хотите сделать такую ​​вещь.

Короче говоря, вы можете написать собственную версию метода get, взяв экземпляр объекта значения, который вы пытаетесь получить. Но действительно нет смысла использовать карту, если вы собираетесь это сделать.

Почему бы не использовать список тех или иных видов, которые вы хотите найти по стоимости?

+0

спасибо, и да, я могу, но мне нужен бот ключ и ценность. значение для процесса шифрования и ключ для процесса дешифрования. Поэтому вы можете рекомендовать мне любую структуру данных, через которую может быть решена проблема. – Srividya

+0

'значение для процесса шифрования и ключ для процесса дешифрования.' - Почему бы вам просто не сохранить нормальную карту? –

+0

@Srividya Ну, если вы не можете найти существующую структуру данных, которую вы хотите использовать, ничто не мешает вам создавать объект, содержащий все нужные вам данные :). вы можете создать свой собственный класс контейнера и сохранить его в коллекции (например, arraylist ) и получить доступ ко всем членам, которые вы хотите. но вы должны иметь в виду, что вам понадобится уникальный способ идентификации объектов. на карте, которая обычно является ключом. –

0

Вы не можете этого сделать, потому что «ценности» могут быть продублированы.

2

как получить ключ от конкретного значения без перебора всех пар ключ-значение в интерфейсе Map

Key является ключевым, а не значение. Ты не можешь сделать это. Это не то, как карта реализована.

Даже если вы сделаете это с каким-то волшебным (перебором несколько раз, проверяя equls и т.д ..), что не гарантировано, чтобы дать ожидаемый результат ..

И согласно определению карты, Ключ уникальный не значение. Таким образом, будут дублироваться значения, и когда вы получите значение, какой ассоциированный ключ вы ожидаете получить?

Если вы уверены, что нет никаких дубликатов, вы можете сделать

for (Entry<Integer, String> entry : testMap.entrySet()) { 
      if (entry.getValue().equals("c")) { 
       System.out.println(entry.getKey()); 
      } 
     } 
1

Как уже говорилось, это невозможно. Интерфейс Map и его реализации не поддерживают это.

Рассмотрите возможность использования BiMap, такого как тот, который был применен в коллекциях Google Guava. Он устанавливает взаимно однозначную (двунаправленную) взаимосвязь между ключами и значениями. https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#BiMap

Используя BiMap, вы можете использовать Key key = biMap.inverse().get(value), чтобы получить ключ для данного значения.

0

Как сказано, это не предусмотрено интерфейсом Java-Map, поскольку у вас должен быть ключ и получить значение.

Обычно у вас есть что-то вроде этого.

User user = ...; 
HashMap<String, User> usernamesToUser = ... 

Тогда вы можете получить ключ что-то вроде:

String username = user.getUsername(); 

Так что без использования карты на самом деле. Однако, что вы можете сделать, если ключ не напрямую извлекается из объекта, вы можете использовать два Карты для обоих направлений. Так считает бывший пример (просто предположу пользователь объект пользователя не безопасно Имя пользователя)

Map<User, String> userMapReverse = ....; 
Map<String, User> userMap = ....; 
String username = userMapReverse.get(user); 

Однако этот вариант требует, чтобы вы поддерживали две карт, которые могут быть довольно уродливыми иногда.

2

Учитывая, что значения уникальны, вы могли бы к нему так:

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

    String key = map.entrySet().stream(). 
    collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)) 
    .get("value1"); 

    System.out.println(key); //gives key1 
+1

Также можно попробовать 'Collectors.groupingBy', который может предоставить вам список ключей, связанных с каждым значением. – OldCurmudgeon

Смежные вопросы