2012-03-16 92 views
2

Im在使用迭代器從ArrayList中刪除項目時遇到問題。我的目標是檢索某個半徑內的點並將它們聚類爲一組組。我正在使用初始點作爲參考。該代碼有一個初始for循環,將遍歷每個地方,然後爲每個地方創建一個內部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(); 
      } 
     } 
    } 
} 

對不起,信息過載,會很感激的幫助。

在此先感謝偷看

熱汗

回答

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(); 
+0

對對不起,我只是注意到了,我也編輯了它。是的,我修復了illegalstateException謝謝。但現在我得到一個ConcurrentModification異常。 :S的事情是我希望兩個循環遍歷相同的列表,內循環可能編輯地點列表太多,因爲在刪除的地方,這是不允許的? – 2012-03-16 01:13:50

+0

你能否通過從兩個地方的相同列表中刪除點來解釋你正在試圖完成的任務?看起來好像你會遇到一些問題,如果你從外部循環迭代時刪除內部循環的項目。另外,在啓動內循環之前調用'iterator.remove()'的原因是什麼? – 2012-03-16 01:25:12

+0

我的目標是根據那裏的半徑放置在一起,因此外部循環將成爲hashmap(參考點)的關鍵,內部循環添加半徑範圍內的地方列表,因此爲什麼它被添加到名單。我調用了iterator.remove(),以便當它執行innerloop時它不會找到正在使用的參考點 – 2012-03-16 01:40:44

2

在同一運行多個迭代器列表不允許。所以你會得到一個併發修改異常。最好製作數組列表的副本,在內部循環中更新要更新的副本位置中的數據。總之,改變你的邏輯

1

我想你會得到異常,因爲你改變列表,而迭代它。

起初,我會用for (... in ...)的構造。

其次,我認爲你必須複製places迭代它,但從places刪除。