Коллекции Java: сравнивайте элементы в коллекции друг с другом и удаляйте за один цикл - PullRequest
4 голосов
/ 13 июля 2010

Скажем, у меня есть коллекция некоторых геолокаций (в формате Country > Region [ > Town [ > District]]), и я хочу удалить местоположения, которые перекрывают друг друга (например, Europe > Germany перекрывается Europe > Germany > Dresden и Europe > Germany > Hamburg, поэтому последние два должныудалить).Я вижу, что мне нужно два экземпляра итераторов, чтобы сделать что-то вроде этого:

final Iterator<Location> outerIterator = locations.newIterator();
while (outerIterator.hasNext()) {
    final Location outer = outerIterator.next();
    final Iterator<Location> innerIterator = locations.newIterator();
    while (innerIterator.hasNext()) {            
        final Location inner = innerIterator.next();
        if (!inner.equals(outer)) {
            if (inner.overlaps(outer)) outerIterator.remove();
            else if (outer.overlaps(inner)) innerIterator.remove();
        }
    }
}

Но я не могу получить новый Iterator для той же коллекции.Мой алгоритм неверен или есть способ сделать это правильно?


Окончательный код, использующий совет из ответа , предоставленного Карл Смотриц выглядитэто:

final Iterator<JobLocation> outerIterator = locations.iterator();
while (outerIterator.hasNext()) {
    final JobLocation outer = outerIterator.next();         
    final Iterator<JobLocation> innerIterator = locations.iterator();
    while (innerIterator.hasNext()) {
        final JobLocation inner = innerIterator.next();
        if (!inner.equals(outer) && inner.overlaps(outer)) {
            outerIterator.remove();
            break;
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 13 июля 2010

Вы уверены, что хотите увеличить свой внешний интерфейс во внутреннем цикле?

2 голосов
/ 13 июля 2010

Я думаю, что вы должны использовать другую структуру для своих регионов, например, дерево, в котором у каждого местоположения есть дочерние элементы. Таким образом, вы можете исключить все области, которые перекрывают другую после простого поиска. Нет необходимости во вложенных итерациях.

Это проще, если ни одно местоположение не может пересекаться с двумя местоположениями, что, кажется, имеет место.

2 голосов
/ 13 июля 2010

Если вы удаляете объект из внешнего итератора, вам нужно сразу же выйти из внутреннего цикла. Я не уверен, что это решит вашу проблему полностью, но может продвинуть вас немного дальше.

Если проблема не устранена, отобразите сообщение об ошибке и / или исключение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...