从列表中删除对象和迭代器问题

时间:2012-03-16 00:51:45

标签: java android google-maps arraylist iterator

我在使用迭代器从arraylist中删除项目时遇到问题。我的目标是检索某个半径范围内的点并将它们聚类成一组组。我使用初始点作为参考。代码有一个初始for循环,它将遍历每个地方,然后为每个地方创建一个内部for循环,以检查参考地点和其余地方之间的半径。如果参考位置和其他位置之间的半径小于我设置的阈值,则它将被添加到与其他类似点分组的arraylist中。当它们被添加到组中时,它们将从原始的arraylist中删除。

然而,我遇到的问题是,它只执行外部for循环一次或我得到IllegalStateException

以下是代码:

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();
            }
        }
    }
}

对不起信息过载,非常感谢帮助。

提前感谢peeps

热汗

3 个答案:

答案 0 :(得分:2)

您正在内循环中踩踏外迭代器。看起来这些行可能有误:

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 :(得分:2)

不允许在同一列表上运行多个迭代器。因此,您将获得并发修改例外。更好地制作数组列表的副本,在内部循环中更新要更新的副本位置中的数据。简而言之,改变你的逻辑

答案 2 :(得分:1)

我猜你会因为在迭代时更改列表而获得异常。

首先,我会使用for (... in ...)构建。

其次,我认为您必须复制places进行迭代,但要从places删除。