Двунаправленная карта на 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"
так что не стоит идти на сложное решение.
6 ответов
Для этого вы можете использовать API Google Collections, недавно переименованный в 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<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"));
}
}
В API Java Standard нет двунаправленной карты. Либо вы можете поддерживать две карты самостоятельно, либо использовать BidiMap из коллекций Apache.
Вы можете вставить ключ, пару значений и ее инверсию в структуру карты, но вам нужно будет преобразовать Integer в строку:
map.put("theKey", "theValue");
map.put("theValue", "theKey");
Использование map.get("theValue") вернет "theKey".
Это быстрый и грязный способ создания постоянных карт, который будет работать только для нескольких избранных наборов данных:
- Содержит только от 1 до 1 пар
- Набор значений не пересекается с набором ключей (1->2, 2->3 ломает его)
Если вы хотите сохранить <Integer, String>
Вы могли бы сохранить вторую <String, Integer>
сопоставить "поставить" значение -> пары ключей.