Двунаправленная карта в Java?
У меня есть простое целочисленное сопоставление в Java, но мне нужно иметь возможность легко извлекать строку из целого числа, а также целое число из строки. Я пробовал Map, но он может извлекать только строку из целого числа, это в одну сторону:
private static final Map<Integer, String> myMap = new HashMap<Integer, String>();
// 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"
, поэтому не стоило бы идти на сложное решение.
Ответы
Ответ 1
Вы можете использовать API коллекций Google для этого, недавно переименованный в Guava, в частности BiMap
Бимап (или "двунаправленная карта" ) - это карта, которая сохраняет уникальность его значений, а также его ключей. Это ограничение позволяет бимакам поддерживать "обратный просмотр", что является еще одним бимапом содержащие те же записи, что и этот бимап, но с обратными ключами и значения.
Ответ 2
Создать Guava BiMap и получить инвертированное значение не так тривиально.
Простой пример:
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
public class BiMapTest {
public static void main(String[] args) {
BiMap<String, String> 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"));
}
}
Ответ 3
В Java Standard API нет двунаправленной карты. Либо вы можете сами сохранить две карты, либо использовать BidiMap из коллекций Apache.
Ответ 4
Коллекции коллекций Apache имеют BidiMap
Ответ 5
Вы можете вставить как пару ключей, значение, так и свою инверсию в структуру вашей карты, но должны были бы преобразовать Integer в строку:
map.put("theKey", "theValue");
map.put("theValue", "theKey");
Использование map.get( "theValue" ) вернет "theKey".
Это быстрый и грязный способ создания постоянных карт, который будет работать только для нескольких наборов данных:
- Содержит только от 1 до 1 пары.
- Набор значений не пересекается с набором клавиш (1- > 2, 2- > 3 разрывает его)
Если вы хотите сохранить <Integer, String>
, вы можете сохранить вторую карту <String, Integer>
, чтобы "поставить" пары значений → .
Ответ 6
Используйте Google BiMap
Это более удобно.