Хотите сравнить две хэш-карты и удалить их

#java

#java

Вопрос:

У меня есть две инициализированные хэш-карты, как показано ниже

FieldType — это объект JAXB.

 Map<String, FieldType> onsDetailsMap    =   new LinkedHashMap<String, FieldType>();
Map<String, FieldType> uxDetailsMap =   new LinkedHashMap<String, FieldType>();
 

Я пытаюсь сравнить «Ключ» двух хэш-карт. Если два ключа равны, мне нужно извлечь «Ключ», и это объект JAXB, записать в другую хэш-карту и удалить ее из фактической хэш-карты.

Попытался удалить его с помощью hashmap.remove(key), но он выдает java.util.ConcurrentModificationException Исключение

 for (String key : onsDetailsMap.keySet()) {
if (uxDetailsMap.containsKey(key)) {

    System.out.println("BOTH :: "  key);
    onsDetailsMap.remove(key);

}else {

       System.out.println("ONS only :: "  key);
}
 

Комментарии:

1. Вам нужно будет использовать iterator или преобразовать его в arraylist, а затем делать что-то еще.

Ответ №1:

Вы не можете перебирать карту в цикле for и удалять записи с этой карты одновременно. Попробуйте это

 Iterator entries = onsDetailsMap.entrySet().iterator();
while (entries.hasNext()) {
  Entry<String, FieldType> entry = (Entry) entries.next();
  if (uxDetailsMap.containsKey(entry.getKey()) {
      System.out.println("BOTH :: "   entry.getKey());
      entries.remove();
  }
}
 

Комментарии:

1. Код выдает ошибку, метод ‘contains (Object)’ не определен для Map(String, FieldType). FieldType — это объект JAXB.

2. О, моя ошибка. Это должна быть необработанная запись и неправильный метод contains. Я обновил ответ.

3. Как мне получить «Значение» соответствующего «ключа»? FieldType является объектом JAXB?

4. Оператор if в приведенном выше фрагменте отсутствует a ).

Ответ №2:

  Iterator<String, FieldType> iter = onsDetailsMap.entrySet().iterator();
 while (iter.hasNext()) {
       Entry<String, FieldType> entry = (Entry) entries.next();
       if (uxDetailsMap.contains(entry.getKey()) {          
           iter.remove();
       }
 }
 

Ответ №3:

Попробуйте этот код, он работает нормально

 Iterator entries = onsDetailsMap.entrySet().iterator();
            while (entries.hasNext()) {
              Entry entry = (Entry) entries.next();
              if(!uxDetailsMap.containsKey(entry.getKey()))
              {
                  System.out.println("Single value:: "   entry.getKey());
                  entries.remove();
              }
            }
 

Комментарии:

1. Спасибо за решение. Это работает. Могу ли я также получить код о том, как мне получить значение этого конкретного ключа? Map<Строка, JAXBObject> .

2. Какое значение вы хотите получить из map уникального или дублирующего? и на какой карте вы хотите сохранить карту выхода или новую?

3. Требуется значение соответствующего «ключа», здесь «значение» — это объект JAXB.

4. как мне преобразовать объект в список?

5. Моя фактическая цель — создать xml из объекта. Поэтому необходимо получить объект (значение ключа) в hashmap.

Ответ №4:

 for (Iterator<Map.Entry<String, Integer>> iterator = onsDetailsMap.entrySet().iterator(); iterator.hasNext();) {
        Map.Entry<String, Integer> entry = iterator.next();
        if (uxDetailsMap.containsKey(entry.getKey()))
                iterator.remove();

}