2011-02-10 73 views
0

我正在使用Java進行數據挖掘項目,並且遇到了ArrayList的奇怪問題。ArrayList訪問應該刪除的元素

ArrayList(availAttribs)包含尚未在決策樹的當前分支中使用的所有屬性的名稱。在循環開始時選擇一個屬性,並將ArrayList中該屬性的索引存儲在chosenAttribute中。執行該邏輯,然後將項目從列表中移除並選擇另一個。

該程序沒有按預期運行,所以我在每個循環中使用a來顯示ArrayList的當前內容,然後才能檢查內容。

這是我得到:

availAttribs contains ... 
-Color 
-size 
-act 
-age 
Chose attribute #1: size 

availAttribs contains ... 
-Color 
-act 
-age 
Chose attribute #1: size 

的屬性是隨機被選擇:

for(String s : availAttribs) { 
    System.out.println(" -" + s); 
} 
chosenAttribute = random.nextInt(availAttribs.size() - 1); 
System.out.println(" Chose attribute #" + chosenAttribute + ": " + 
     trainSet.attribute(chosenAttribute).name()); 

// other stuff here 

availAttribs.remove(chosenAttribute); 

所有這一切是一個while循環檢查退出條件內。我認爲如果一個項目沒有成功刪除,當我遍歷列表並打印每個元素時,它會顯示出來,但顯然它仍然可以訪問它們。

編輯: 隨機被宣佈爲while循環外:

Random random = new Random(System.currentTimeMillis()); 
+0

你能展示如何宣佈隨機? – 2011-02-10 22:29:43

+0

什麼是trainSet?您只需修改availAttribs,但顯示trainSet的內容。他們耦合? – 2011-02-10 22:37:52

回答

0

我想出了答案,同時試圖解釋部分代碼以迴應評論。 chosenAtrribute是關於ArrayList的索引,並且由於我填充ArrayList的方式,它對應於我在內部使用的數據結構在內部分配給每個屬性的索引。當我從ArrayList中刪除一個項目後,它向前滑動並且不再同步。

因爲我的調試語句從數據結構,而不是從自身ArrayList中抓住了它的名字顯示錯了名字,而預期ArrayList中的表現。不知道爲什麼我沒有早點注意到。

1

ArrayList.remove(的OBJ)去除第一(最低索引)對象服從obj.equals(的OBJ)。你打電話卸下指數:

availAttribs.remove(chosenAttribute); 

應該

availAttribs.remove(availAttribs.get(chosenAttribute)); 

即該元素的索引我,而不是我的價值;

0

我的猜測 - 你是一個Integer對象調用List.remove(...),而不是一個int原始。什麼是chosenAttribute變量的類型?

調用remove(...)與物體撞擊的remove(對象)方法,例如:

Integer chosenAttribute = ... 
availAttribs.remove(chosenAttribute); 

將循環永遠,但是:

int chosenAttribute = ... 
availAttribs.remove(chosenAttribute); 

終止如預期。

你可以得到INT原始的指數,並呼籲List.remove(int),也可以將索引獲取對象,並調用List.remove(object)。要麼應該工作。