Двунаправленная карта в Java? [дубликат]


этот вопрос уже есть ответ здесь:

у меня есть простое отображение целого числа в строку в Java, но мне нужно иметь возможность легко извлекать строку из integer, а также integer из string. Я пробовал 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 61

6 ответов:

для этого вы можете использовать API Google Collections, недавно переименованный в гуавы, конкретно a BiMap

bimap (или" двунаправленная карта") - это карта, которая сохраняет уникальность его значений, а также его ключей. Это ограничение позволяет bimaps поддерживать "обратный вид", который является другим bimap содержащий те же записи, что и этот 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 нет двунаправленной карты. Либо вы можете поддерживать две карты самостоятельно, либо использовать BidiMap из коллекции Apache.

Apache commons collections имеет BidiMap

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

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

используя карту.получить("значение") тогда возврат "основной".

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

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

Если вы хотите сохранить <Integer, String> вы могли бы поддерживать второй <String, Integer> карта, чтобы "поставить" значение - > пары ключей.

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

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