2010-04-13 60 views
1

我有一個ArrayIndexOutofBounds異常與下面的代碼。 唯一的例外是在所在行Node nodeJ = vect.get(j)向量ArrayIndexOutOfBounds

但它沒有任何意義,我因爲Ĵ肯定是小於i和Node nodeI = vect.get(i)不拋出任何的異常。

任何幫助表示讚賞。

public static Vector join(Vector vect) throws ItemNotFoundException {

Vector<Node> remain = vect; 
    for (int i = 1; i < vect.size(); i++) { 
     Node nodeI = vect.get(i); 
     for (int j = 0; j < i; j++) {//traverse the nodes before nodeI 
      Node nodeJ = vect.get(j); 

      if (nodeI.getChild1().getSeq().equals(nodeJ.getSeq())) { 
       nodeI.removeChild(nodeJ); 
       nodeI.setChild(nodeJ); 
       remain.remove(j); 
      } 
      if (nodeI.getChild2().getSeq().equals(nodeJ.getSeq())) { 
       nodeI.removeChild(nodeJ); 
       nodeI.setChild(nodeJ); 
       remain.remove(j); 
      } 
     } 
    } 
    return remain; 
} 

回答

6

您將要從你迭代相同的向量元素,通過一個別名參考,remain。如果你想使用一個副本,而不是,你應該有

Vector<Node> remain = new Vector<Node>(vect); 
+0

啊,我明白了,謝謝! – Esmond 2010-04-13 14:35:50

4

,如果在你的內部循環,你從載體移除超過i - j節點會發生什麼?你將以j > vect.size()結束。

可能最好將第二個for循環的條件改爲j < i && j < vect.size(),但是我認爲有一個算法存在某些缺陷,這個算法在迭代時需要對集合進行雙迭代以從中移除元素。

1

當你迭代它時,你正從vect中刪除東西。你確定這就是你想要做的?

記住這條線:

Vector<Node> remain = vect; 

創建vect副本。從remain中刪除一些東西,它也會從vect中刪除,因爲這兩個名稱引用了相同的實際對象。

+0

啊我看到了,我想從剩下的東西中刪除東西,同時保持vect完好無損。所以我想我應該做一個 向量 newVect = vect.clone(); 然後保持= newVect; 是這樣對嗎? – Esmond 2010-04-13 14:34:35

+0

如果可能的話,我會盡量避免使用clone(),尤其是因爲所有內建的'Collection'類都有複製構造函數,用於從任何其他'Collection'類創建新實例。以PéterTörök提供的示例爲例。 – Syntactic 2010-04-13 15:36:17

0

您正在從您的載體中移除項目。

使用一些日誌記錄在內部循環的每次迭代中輸出向量的內容,您將看到發生了什麼。

0

當您從矢量(您所做的)中移除一個項目時,矢量的長度會發生變化。問題是刪除後的代碼已經刪除了很多節點,現在它使用的索引不再有效。