我在使用迭代器从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
热汗
答案 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
删除。