Обратные ключи и значения HashMap в Java

Это простой вопрос, у меня есть простой HashMap, из которого я хочу изменить ключи и значения.

HashMap myHashMap = new HashMap(); myHashMap.put('a', "test one"); myHashMap.put('b', "test two"); 

и я хочу создать новую HashMap, в которой я помещаю противоположности.

 HashMap reversedHashMap = new HashMap(); eg Keys "test one" & "test two" and values 'a' & 'b'. 

Все они уникальны, да

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

 Map myNewHashMap = new HashMap<>(); for(Map.Entry entry : myHashMap.entrySet()){ myNewHashMap.put(entry.getValue(), entry.getKey()); } 

В качестве альтернативы вы можете использовать двунаправленную карту, такую ​​как Guava, и использовать метод inverse() :

 BiMap myBiMap = HashBiMap.create(); myBiMap.put('a', "test one"); myBiMap.put('b', "test two"); BiMap myBiMapInversed = myBiMap.inverse(); 

Поскольку java-8 отсутствует, вы также можете сделать это следующим образом:

 Map map = new HashMap<>(); map.put("a",1); map.put("b",2); Map mapInversed = map.entrySet() .stream() .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)) 

Наконец, я добавил свой вклад в библиотеку протонных пакетов , которая содержит утилиты для Stream API. С этим вы можете сделать это так:

 Map mapInversed = MapStream.of(map).inverseMapping().collect(); 

Библиотека коллекций коллективных коллекций Apache предоставляет метод утилиты для обращения к карте. Вы можете использовать это, если уверены, что значения myHashMap уникальны

 org.apache.commons.collections.MapUtils.invertMap(java.util.Map map) 

Образец кода

 HashMap reversedHashMap = MapUtils.invertMap(myHashMap) 

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

 HashMap myHashMap = new HashMap(); HashMap reversedHashMap = new HashMap(); for (char i : myHashMap.keySet()) { reversedHashMap.put(myHashMap.get(i), i); } 

Чтобы ответить на ваш вопрос о том, как вы можете это сделать, вы можете получить entrySet с вашей карты, а затем просто ввести новую карту, используя getValue в качестве key и getKey как value .

Но помните, что ключи на карте уникальны, что означает, что если у вас есть одно значение с двумя разными ключами на исходной карте, только второй ключ (в порядке итерации) будет иметь значение kep в новой карте.

Перейдите по списку ключей и значений, затем добавьте их.

 HashMap reversedHashMap = new HashMap(); for (String key : myHashMap.keySet()){ reversedHashMap.put(myHashMap.get(key), key); } 

Если значения не уникальны, безопасный способ инверсии карты состоит в использовании функции группировки java 8

 Map map = new HashMap<>(); map.put("a",1); map.put("b",2); Map> mapInversed = map.entrySet() .stream() .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList()))) 
 private  Map invertMap(Map map) { Map reverseMap = new HashMap<>(); for (Map.Entry entry : map.entrySet()) { reverseMap.put(entry.getValue(), entry.getKey()); } return reverseMap; } 

Важно помнить, что put заменяет значение при вызове одним и тем же ключом. Поэтому, если у вас есть две клавиши с одинаковым значением, только одна из них будет существовать в перевернутой карте.

Протестировано с помощью fragmentа снизу, с помощью функции MapUtils и Java8 Stream. Он работал с обоими случаями.

 public static void main(String[] args) { Map test = new HashMap(); test.put("a", "1"); test.put("d", "1"); test.put("b", "2"); test.put("c", "3"); test.put("d", "4"); test.put("d", "41"); System.out.println(test); Map test1 = MapUtils.invertMap(test); System.out.println(test1); Map mapInversed = test.entrySet() .stream() .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); System.out.println(mapInversed); } Output: {a=1, b=2, c=3, d=41} {1=a, 2=b, 3=c, 41=d} {1=a, 2=b, 3=c, 41=d} 
  • Как установить приоритетный приемник мыши
  • Преобразование объекта Java в JsonNode в jacksonе
  • Получает массив байтов из ByteBuffer в java
  • JButton () работает только при наведении мыши
  • Преобразование двоичной строки в байтовый массив
  • Удалить дубликаты из списка объектов на основе свойства в Java 8
  • Java FileOutputStream Создать файл, если он не существует
  • Инъекция зависимостей в Struts2 Доступ к фазам с включенным сеансом
  • Не удалось зарезервировать достаточно места для кучи объектов
  • Как вызвать статический метод в JSP / EL?
  • Удаление элемента из массива (Java)
  • Давайте будем гением компьютера.