Существует ли структура данных с двумя индексами / ключевой структурой данных? - PullRequest
2 голосов
/ 13 мая 2019

Существует ли в Java структура данных (java util, guava ...), которая позволяет мне хранить пары "ключ-значение", которые также могут интерпретироваться как значение-ключ?

Пример:

Datastructure d = new Datastructure();

d.add(1, "foo");
d.add(21 "bar");
d.add(33 "hello");
d.add(55 "world");

Функция типа d.get1(1) должна возвращать foo.Функция типа d.get2("foo") должна возвращать 1.

Функция типа d.get1(33) должна возвращать hello.Функция типа d.get2("hello") должна возвращать 33.

...

Есть ли что-то, что работает так?

Ответы [ 4 ]

2 голосов
/ 13 мая 2019

В библиотеке коллекций Apache commons есть интерфейс BidiMap и некоторые его реализации. В интерфейсе есть метод для получения обратной карты, то есть карты, где меняются роль ключа и значения.

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

1 голос
/ 13 мая 2019

Да, Guava имеет интерфейс BiMap с множеством реализаций, включая HashBiMap и ImmutableBiMap, которые предоставляют представление inverse() для обратного просмотра.Также обратите внимание, что они реализованы более эффективно, чем простое хранение пары карт, по одной в каждом направлении - хотя на некотором уровне невозможно создать значительно лучшую реализацию.

1 голос
/ 13 мая 2019

То, что вы ищете, по сути реализовано в BiMap.
от Guava. Вы можете использовать BiMap guava вот так -

BiMap<Integer, String> biMap = HashBiMap.create();
biMap.put(1, "foo");
biMap.put(21, "bar");

System.out.println(biMap.get("1"))); //foo
System.out.println(biMap.inverse().get("bar"))); //21

Ссылка:
- Путеводитель по гуаве BiMap
- BiMap Java документ

В качестве альтернативы вы можете использовать apache common BiDiMap, например:

BidiMap<String, String> map = new DualHashBidiMap<>();
map.put(1, "foo");
map.put(21, "bar");
System.out.println(map.get(1)); //1

//reversing the mapping 
BidiMap<String, String> reversedMap = map.inverseBidiMap();
System.out.println(reversedMap.get("foo")); //1
1 голос
/ 13 мая 2019

В Java нет такого класса, но вы можете делать то, что хотите, с помощью этого:

Map<Object, Object> map = new HashMap<>();

map.put(1, "foo");
map.put(21, "bar");
map.put(33, "hello");
map.put(55, "world");
map.put("foo", 1);
map.put("bar", 21);
map.put("hello", 33);
map.put("world", 55);

System.out.println(map.get(1)); // foo
System.out.println(map.get("foo")); // 1

выглядит и странно, но работает как хочешь.

Или вы можете создать свой собственный класс, который работает так, как вам нужно, возможно, используя одну карту, как я показал, или две карты типа: Map<Integer, String> map1... Map<String, Integer> map2...

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...