Удаление объектов из списка и проблем с итераторами - PullRequest
2 голосов
/ 16 марта 2012

У меня проблемы с удалением элементов из массива с помощью итератора.Моя цель - найти точки в пределах определенного радиуса и сгруппировать их в набор групп.Я использую начальные точки в качестве ссылки.В коде есть начальный цикл for, который будет проходить через каждое место, затем для каждого места создается внутренний цикл for, чтобы проверить радиус между опорным местом и остальными местами.Если радиус между эталонным местом и другим местом меньше установленного мной порогового значения, он будет добавлен в массив, сгруппированный с другими подобными точками.Поскольку они добавляются в группы, они будут удалены из исходного массива.

Однако у меня возникают проблемы, такие как либо выполнение внешнего цикла for только один раз, либо получение IllegalStateException.

* 1005.* Вот код:
HashMap<Place, ArrayList<Place>> sets = new HashMap<Place, ArrayList<Place>>();

private void cluster(ArrayList<Place> places) {

    for (Iterator<Place> iterator = places.iterator(); iterator.hasNext();) {
        Place pl = iterator.next();
        ArrayList<Place> subset = new ArrayList<Place>(); // Group
        GeoPoint g = new GeoPoint((int) (pl.getGeometry().getLocation()
                .getLat() * 1e6), (int) (pl.getGeometry().getLocation()
                .getLng() * 1e6));
        Point point = new Point();
        mapView.getProjection().toPixels(g, point);
        sets.put(pl, subset);
        subset.add(pl);
        iterator.remove();

        for (Iterator<Place> iterator2 = places.iterator(); iterator2
                .hasNext();) {
            Place pl2 = iterator2.next();
            int threshold = 100;
            GeoPoint g2 = new GeoPoint((int) (pl2.getGeometry()
                    .getLocation().getLat() * 1e6), (int) (pl2
                    .getGeometry().getLocation().getLng() * 1e6));
            Point point2 = new Point();
            mapView.getProjection().toPixels(g2, point);
            int dx = Math.abs(point2.x - point.x);  
            int dy = Math.abs(point2.y - point.y);
            if (dx < threshold && dy < threshold) {
                subset.add(pl2);
                iterator2.remove();
            }
        }
    }
}

Извините за информационную перегрузку, буду очень признателен за помощь.

Заранее благосклонно выглядывает

Rehan

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

запуск нескольких итераторов по одному и тому же списку не допускается.Таким образом, вы получите исключение одновременной модификации.Лучше сделайте копию списка массивов, во внутреннем цикле обновите данные в той позиции, где вы хотите обновить.Короче, поменяй логику

2 голосов
/ 16 марта 2012

Вы перешли внешний итератор во внутренний цикл.Похоже, что эти строки могут быть ошибочными:

for (Iterator<Place> iterator2 = places.iterator(); iterator.hasNext();) {
    Place pl2 = iterator.next();

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

for (Iterator<Place> iterator2 = places.iterator(); iterator2.hasNext();) {
       Place pl2 = iterator2.next();
1 голос
/ 16 марта 2012

Полагаю, вы получаете исключение, потому что вы изменяете список во время итерации.

Сначала я бы использовал конструкцию for (... in ...).

Во-вторых, я думаю, вам нужно скопировать placesитерация, но удаление из places.

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