Мне нужна структура данных для хранения международных строкой пар значения в 1:1 отношения, и способность также поднимает глаза от так или иначе их дубликата.
Я записал класс с Хеш-таблицей и Массивом строк и хранил данные 2 раза и использовал созданный в функциях для поиска.
Мой вопрос, это - там более хороший способ выполнить это? И более хорошим я означаю быть эффективным и не хранить данные 2 раза, и предпочтительно не пишущий тонну кода также :P.
Похоже, вы ищете бимап.
Коллекции Google (теперь часть Guava ) содержат интерфейс BiMap
с несколькими реализациями.
Из документации BiMap
:
BIMAP (или «двунаправленная карта») - это отображение, сохраняющее единственность его ценности, а также ключи. Это ограничение позволяет использовать бимапы. чтобы поддержать "обратную точку зрения", которая другой бимап, содержащий то же самое записи как этот бимап, но с поменять местами ключи и значения.
Метод BiMap.inverse
, похоже, возвращает Map
со значениями в качестве ключей и ключами в качестве значений, так что Map
может быть используется для вызова get
значения и получения ключа.
Кроме того, карта
, возвращаемая инверсией
, является представлением базовых данных, поэтому не нужно делать дополнительные копии исходных данных.
Из документации метода BiMap.inverse
:
Возвращает обратный вид этого bimap, который отображает каждый из значения к соответствующему ключу. Два бимапы поддерживаются теми же данными; любые изменения в одном из них появятся в разное.
Вы можете сделать такую простую реализацию. Обратите внимание, что в этой реализации данные не копируются. Только ссылки есть! Я добавил реализацию для добавления и получения. remove и другой требуемый метод оставлены в качестве упражнения :)
public class TwoWayHashmap<K extends Object, V extends Object> {
private Map<K,V> forward = new Hashtable<K, V>();
private Map<V,K> backward = new Hashtable<V, K>();
public synchronized void add(K key, V value) {
forward.put(key, value);
backward.put(value, key);
}
public synchronized V getForward(K key) {
return forward.get(key);
}
public synchronized K getBackward(V key) {
return backward.get(key);
}
}
И, конечно же, его приложения несут ответственность за то, чтобы даже «значения» были уникальными. Пример использования:
TwoWayHashmap twmap = new TwoWayHashmap<String, String>();
twmap.add("aaa", "bbb");
twmap.add("xxx", "yyy");
System.out.println(twmap.getForward("xxx"));
System.out.println(twmap.getBackward("bbb"));
Google Guava имеет BiMap , который делает то, что вы хотите.
Создайте хэш-карту, которая отображает объект в объект - затем вы можете использовать ту же карту для хранения String -> Integer и Integer -> String.
Когда вы добавляете пару строка / целое число, просто добавляйте ее в обоих направлениях к одной и той же карте.