Двунаправленная карта в Java?

У меня есть простое целочисленное сопоставление в Java, но мне нужно легко получить строку из целого числа, а также целое число из строки. Я пробовал Map, но он может извлекать только строку из целого числа, это один из способов:

private static final Map myMap = new HashMap(); // This works one way: String myString = myMap.get(myInteger); // I would need something like: Integer myInteger = myMap.getKey(myString); 

Есть ли правильный способ сделать это для обоих направлений?

Другая проблема заключается в том, что у меня есть только несколько постоянных значений, которые не меняются ( 1->"low", 2->"mid", 3->"high" , поэтому не стоило бы идти на сложный решение.

Вы можете использовать API коллекций Google для этого, недавно переименованный в Guava , в частности BiMap

Бимап (или «двунаправленная карта») – это карта, которая сохраняет уникальность ее значений, а также ее ключей. Это ограничение позволяет бимакам поддерживать «обратный вид», который является еще одним бимапом, содержащим те же записи, что и этот бимап, но с отмененными ключами и значениями.

Создать Guava BiMap и получить инвертированное значение не так тривиально.

Простой пример:

 import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; public class BiMapTest { public static void main(String[] args) { BiMap biMap = HashBiMap.create(); biMap.put("k1", "v1"); biMap.put("k2", "v2"); System.out.println("k1 = " + biMap.get("k1")); System.out.println("v2 = " + biMap.inverse().get("v2")); } } 

В Java Standard API нет двунаправленной карты. Либо вы можете поддерживать две карты самостоятельно, либо использовать BidiMap из коллекций Apache.

Коллекции коллекций Apache имеют BidiMap

Вы могли бы вставить как ключ, значение, так и его инверсию в свою структуру карты, но должны были бы преобразовать Integer в строку:

 map.put("theKey", "theValue"); map.put("theValue", "theKey"); 

Используя map.get («theValue»), вы вернетесь «theKey».

Это быстрый и грязный способ создания постоянных карт, которые будут работать только для нескольких наборов данных:

  • Содержит только от 1 до 1 пары
  • Набор значений не пересекается с набором клавиш (1-> 2, 2-> 3 разрывает его)

Если вы хотите сохранить вы можете сохранить вторую карту чтобы «поставить» пары значений ->.

Использовать BiMap Google

Это более удобно.

  • Есть ли у Java HashMap с обратным поиском?
  • std :: map, указатель на значение ключа карты, возможно ли это?
  • «Невозможно создать общий массив ...» - как создать массив карт ?
  • Hashtable в C ++?
  • Функциональное программирование, карта Scala и свернуть влево
  • как вы делаете гетерогенную boost :: map?
  • boost :: flat_map и его производительность по сравнению с картой и unordered_map
  • Scala лучший способ превратить коллекцию в Map-by-key?
  • Проверка содержимого стандартного контейнера (std :: map) с помощью gdb
  • Как скопировать одну карту в другую с помощью std :: copy?
  • Производительность традиционного для цикла против Iterator / foreach в Java
  • Interesting Posts

    При выборе репозитория Android SDK Manager дает ошибку «Ошибка при получении URL https://dl-ssl.google.com/android/repository/repository.xml»

    Перегрузка оператора в C

    Решение javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed Ошибка?

    Переустановка Mac OS X без оригинального диска

    Вертикальное выравнивание изображения

    Mockito Как издеваться над вызовом метода суперclassа

    У bash есть крючок, который запускается перед выполнением команды?

    View-based NSTableView с строками с динамическими высотами

    Запуск командного файла в области уведомлений

    Как настроить имена параметров при связывании объектов командной строки spring mvc

    не могут вызвать защищенные функции базового classа?

    Как я могу изменить порт IIS Express для сайта

    Размер шрифта слишком большой, чтобы соответствовать кешу

    Компьютер неустойчив при более низких температурах

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

    Давайте будем гением компьютера.