Двунаправленная карта на 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> сопоставить "поставить" значение -> пары ключей.

У Apache общих коллекций есть BidiMap

Используйте Google BiMap

Это удобнее.

Другие вопросы по тегам