Структура данных для поиска (разных) Integer Java - PullRequest
1 голос
/ 11 июня 2011

Я ищу структуру данных, оптимизированную для поисковых операций (в Java std-lib). Мне приходится повторять его несколько раз, контролировать каждый элемент и удалять его в особых случаях. Я использовал HashMap, но всегда получаю следующую ошибку:

for (Edge e : edges) {
    if (special case)
    edges.remove(e);
}

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:810)
at java.util.HashMap$KeyIterator.next(HashMap.java:845)
at package.name.TFinder.nN(TFinder.java:83)
at package.name.TFinder.fIT(TFinder.java:56)
at package.name.Main.main(Main.java:215)

Ответы [ 3 ]

4 голосов
/ 11 июня 2011

Из вашего описания вы сможете использовать HashMap для этого.Ключ должен использовать iterator.remove() для удаления записей:

for (Iterator<Map.Entry<Key,Value>> it = map.entrySet().iterator(); it.hasNext();)
{
    Map.Entry<Key,Value> entry = it.next();
    // process the entry
    if(need to delete the entry) 
    {
        it.remove();
    }
}
0 голосов
/ 11 июня 2011

Использование ConcurrentHashMap

0 голосов
/ 11 июня 2011

Это исключение выдается, когда вы добавляете / удаляете (/ редактируете) что-то в коллекции во время прохождения через нее (например, в цикле for).

Чтобы решить эту проблему, вы должны использовать 'блокировка »в многопоточной среде.Если вы делаете что-то внутри самого ответственного цикла for, вы можете скопировать свою структуру данных во вторичную (временную), а затем выполнить итерацию только для одного из двух и выполнить все необходимые действия для другого.

Надеюсь, это поможет!

...