2013-08-21 2 views
-3

я должен сравнить 2 Map ключей, если ключи равны на основе map2 значения 'Y' или 'N', я должен удалить эту запись из map1. Я делаю это ниже, но получаю ConcurrentModificationException. Не могли бы вы рассказать мне, почему?эффективного удаление записи Hashmap

HashMap<String,String> map1 = new HashMap<String,String>(); 
map1.put("test", "1"); 
map1.put("test2", "2"); 

HashMap map2 = new HashMap(); 
map2.put("test", "Y"); 
map2.put("test2", "N"); 

for (Map.Entry<String, String> me : map1.entrySet()) { // assuming your map is Map<String, String> 
    if (map2.containsKey(me.getKey())) { 
     if (map2.get(me.getKey()).equals("Y")) { 
      map1.remove(me.getKey()); 
     } 
    } 
} 
System.out.println("Found Duplicate -> " + map1); 
+0

Вы пробовали? '.remove ()' должен делать .. –

+7

Действительно? Сначала проверьте таблицу. Получите результаты типа, где либо флаг равен Y. Затем удалите эти типы с карты. Скажите, пожалуйста, это домашняя работа, а не ваша дневная работа. –

+0

Что вы спрашиваете? Как удалить что-то из хэш-карты? Или как закодировать таблицу? Или что-то другое? Пожалуйста, будьте более конкретными. – jazzbassrob

ответ

1

«Расширенные для цикла» использует Iterator, и единственный безопасный способ изменить коллекцию при использовании его Iterator является вызовом до remove() на итераторе. Вы можете сделать это следующим образом:

static void deleteFlaggedEntries(Map<?, ?> readwrite, Map<?, ?> readonly) 
{ 
    Iterator<?> keys = readwrite.keySet().iterator(); 
    while (keys.hasNext()) { 
    if ("Y".equals(readonly.get(keys.next()))) 
     keys.remove(); 
    } 
} 

Обратите внимание, что при движении заднего хода вызова equals(), так что он всегда называется по строке "Y", вы можете удалить дополнительную проверку, чтобы увидеть, если ключ присутствует с , потому что если он отсутствует, звонок equals() вернет false вместо того, чтобы выбрасывать NullPointerException.

+0

+1 для объяснения '.equals()'. –

+0

Спасибо erickson, что, если я хочу проверить один ключ карты с другим ключом карты. Он содержит метод неправильного использования. – user2680017

2

Вы не можете remove элемент из Map вы итерация. Это вызывает ConcurrentModificationException.

Итереть по map2 во внешнем контуре и удалить элементы из map1, которые соответствуют вашему состоянию.

Edit:

ли это:

package stack.overflow.playground; 

import java.util.HashMap; 
import java.util.Map; 

public class StackOverflowPlayground { 

    public static void main(String[] args) { 
     Map<String, String> map1 = new HashMap<>(); 
     map1.put("test", "1"); 
     map1.put("test2", "2"); 

     Map<String, String> map2 = new HashMap<>(); 
     map2.put("test", "Y"); 
     map2.put("test2", "N"); 

     for (Map.Entry<String, String> me : map2.entrySet()) { 
      if ("Y".equals(me.getValue())) { 
       map1.remove(me.getKey()); 
      } 
     } 

     System.out.println(map1); // {test2=2} 
    } 
} 
+0

обновил мой вопрос, пожалуйста, уточните – user2680017

+0

Я новичок в java, где именно я делаю ошибку ?.any лучший способ сделать это промежутки производительности и памяти. – user2680017

+0

@ user2680017 Что Tichodroma говорит, что вы не можете удалять записи с карты, пока вы перебираете ее ключи. Прокрутите одну карту и удалите записи из * другого *. –

0

Посмотрите на Map#entrySet(). Этот метод дает вам live вид набора карт, поэтому вы можете использовать Set#removeAll(otherSet) для достижения разности заданий. В общей сложности он должен быть один вкладышем:

map1.entrySet().removeAll(otherSet); 

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