Как удобно менять клавиши и значения на карте
Я уже знаю, как сделать это с трудом, и получил его работу - итерация по элементам и свопинг "вручную". Но я удивляюсь, что, как и многие задачи, это можно решить более элегантным способом.
Я прочитал этот пост, к сожалению, в нем нет элегантных решений. У меня также нет возможности использовать какие-либо причудливые Guava BiMaps или что-либо за пределами jdk (стек проекта уже определен).
Я могу предположить, что моя карта биективна, btw:)
Ответы
Ответ 1
Стандартная среда выполнения API/Java не предлагает двунаправленную карту, поэтому единственное решение - перебирать все записи и вручную менять их.
Что вы можете сделать, так это создать класс-оболочку, который содержит две карты и который выполняет двойную put()
внутренне, чтобы у вас было бы быстрое представление двух данных.
[EDIT] Кроме того, благодаря открытому исходному коду вам не нужно включать стороннюю библиотеку, вы можете просто скопировать нужные вам классы в свой собственный проект.
Ответ 2
Если у вас нет выбора использовать стороннюю библиотеку, я не считаю этот код настолько уродливым (хотя некоторые языки сценариев имеют изящные способы сделать это):
//map must be a bijection in order for this to work properly
public static <K,V> HashMap<V,K> reverse(Map<K,V> map) {
HashMap<V,K> rev = new HashMap<V, K>();
for(Map.Entry<K,V> entry : map.entrySet())
rev.put(entry.getValue(), entry.getKey());
return rev;
}
Ответ 3
Map<String, Integer> map = new HashMap<>();
Map<Integer, String> swapped = map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
Ответ 4
Карты не похожи на списки, которые можно отменить путем замены головы хвостом.
Объекты на картах имеют вычисленную позицию, и использование значения как ключа и ключа как значения потребует повторного вычисления места хранения, необходимо создать еще одну карту. Нет элегантного способа.
Существуют, однако, двунаправленные карты. Это может удовлетворить ваши потребности. Я бы пересмотрел использование сторонних библиотек.
Ответ 5
Есть некоторые задания, которые могут быть упрощены до определенного момента и не более. Это может быть один из них!
Если вы хотите выполнить задание с использованием Java-коллекций apis, тогда грубая сила - это путь, который будет быстрым (если коллекция не будет огромной), и это будет очевидный фрагмент кода.
Ответ 6
Как подсказка ответить
fooobar.com/info/428417/...
Это работает только в том случае, если карта не является HashMap и не содержит повторяющихся значений.
Map<String,String> newMap = oldMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
генерирует исключение
java.lang.IllegalStateException: Дублирующий ключ
если есть значения более одного раза.
Решение:
HashMap<String,String> newMap = new HashMap<>();
for(Map.Entry<String,String> entry : oldMap.entrySet())
newMap.put(entry.getValue(), entry.getKey());
// Add inverse to old one
oldMap.putAll(newMap);