我没有发现任何类似的问题,其中一个集合在循环访问另一个集合时被访问。大多数关于两个集合和循环的问题都是指同时循环两个集合。
我在我的应用程序中使用 Google Road API。(文档:https ://developers.google.com/maps/documentation/roads/snap )
简化的史前史:
有一条汽车路线的折线。它应该根据真实的道路坐标进行校正,然后根据每个点的速度着色。
所以,我有自己的 RoutePoint 对象:
public class RoutePoint{
private double latitude;
private double longitude;
private double speed;
}
从List<RoutePoint> routePoints我获取纬度和经度中,使用 interpolate = true 构建对 Google Roads Api 的请求,并使用真实的道路坐标接收我的固定点,一切都很好。
每个收到snappedPoint的(如谷歌所说的)都有originalIndex属性,如果请求,它是每个初始点的索引。由于我使用interpolate= true,大小snappedPoints通常会大于originalPoints每个插值点都会有originalIndex = null。
public class SnappedPoint{
private SnappedLocation location;
private Integer originalIndex;
private String placeId;
}
收到我的snappedPoints后,我的任务是根据每个点的速度绘制彩色折线。为了做到这一点,我需要将原始点与捕捉点匹配originalIndex。然后,为每个snappedPoints. 所以,我添加speed到SnappedPoint类:
public class SnappedPoint{
private SnappedLocation location;
private Integer originalIndex;
private String placeId;
private double speed;
}
为了将原始点与捕捉点匹配,我决定循环遍历snappedPoints,当originalIndex匹配routePoint索引时,将其复制speed到snappedPoint:
int counter = 0;
for (int i = 0; snappedPoints.size() > i; i++) {
SnappedPoint snappedPoint = snappedPoints.get(i);
RoutePoint routePoint = routePoints.get(counter); //ConcurrentModificationException at this line
//do my match speed logic, but I can never come to this point
if (snappedPoint.getOriginalIndex() == null) {
snappedPoint.setSpeed(routePoint.getSpeed());
} else {
if (snappedPoint.getOriginalIndex() <= counter) {
snappedPoint.setSpeed(routePoint.getSpeed());
} else {
counter++;
}
}
}
现在,我们遇到了我的问题。尝试访问时出现ConcurrentModificationExceptionroutePoints.get()。据我了解,这是因为我在循环访问另一个集合时访问了一个集合。
如何避免这种异常?或者如何将原始点与捕捉点匹配,避免这种情况?