Подтвердить что ты не робот

Двунаправленная карта в 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", поэтому не стоило бы идти на сложное решение.

4b9b3361

Ответ 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

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