2012-05-05 140 views
-2

此代碼根據來自trutheality的建議進行了編輯。ArrayList的問題<ArrayList <String>>

我很難提出一個好的標題 - 如果你有一個更好的主意,請隨時改變它。

我正在創建一個二維ArrayList。爲此,我填寫一個ArrayList<String>,然後將其添加到ArrayList<ArrayList<String>>。我在一個循環內部做了這個,我希望每次都能得到新的ArrayList<String>。這不會發生,所以ArrayList<ArrayList<String>>得到充滿積累ArrayList<String>,因爲每次我填滿ArrayList<String>它只是增加了它已有的東西。

ArrayList<String> oneD = new ArrayList<String>(); 
ArrayList<ArrayList<String>> twoD= new ArrayList<ArrayList<String>>(); 

Cursor tSCursor = retrieveTS(tId); 
tSCursor.moveToFirst(); 

for (int i = 0; i < tSCursor.getCount(); i++) 
    { 
     stockId = tSCursor.getString(tSCursor.getColumnIndex("_id")); 

     oneD.add(sId); 

     oneD.addAll(retrieveSFinParams(sId)); 

     twoD.add(sFinParams);   

     tSCursor.moveToNext(); 
    } 

我試過sFinParams.clear(),但作爲容器的Java用戶參考,當我使用清除()我也失去在2D ArrayList中的值。

我怎樣才能得到一個新的ArrayList每次所以當我充滿二維ArrayList我不重複的一維ArrayList的內容?

我感謝所有幫助, d

+1

當你的ArrayLists的ArrayList,它意味着你缺乏一個類。 OOP代碼避免了這些問題。 –

+1

你有投票嗎?我不會說這是一個糟糕的問題,只是誤導...... – Tharwen

+0

你的代碼有點難以理解(例如,什麼是sFinParams?你在哪裏使用你的ArrayLists?)。你能舉出一個你想要實現的更簡單的例子嗎? – Hedja

回答

2

我要想象你的代碼實際上是

ArrayList<String> oneD = new ArrayList<String>(); 
ArrayList<ArrayList<String>> twoD= new ArrayList<ArrayList<String>>(); 

Cursor tSCursor = retrieveTS(tId); 
tSCursor.moveToFirst(); 

for (int i = 0; i < tSCursor.getCount(); i++) 
{ 
    stockId = tSCursor.getString(tSCursor.getColumnIndex("_id")); 

    oneD.add(sId); 

    oneD.addAll(retrieveSFinParams(sId)); 

    twoD.add(oneD);   

    tSCursor.moveToNext(); 
} 

的問題是,您將反覆添加相同的對象(oneD)到twoD,而不是爲twoD每個條目創建一個新的oneDArrayList 。解決方法是簡單地認爲:創建oneD循環,使每次迭代使用不同的oneD作品:

ArrayList<ArrayList<String>> twoD= new ArrayList<ArrayList<String>>(); 

Cursor tSCursor = retrieveTS(tId); 
tSCursor.moveToFirst(); 

for (int i = 0; i < tSCursor.getCount(); i++) 
{ 
    stockId = tSCursor.getString(tSCursor.getColumnIndex("_id")); 

    ArrayList<String> oneD = new ArrayList<String>(); 

    oneD.add(sId); 

    oneD.addAll(retrieveSFinParams(sId)); 

    twoD.add(oneD);   

    tSCursor.moveToNext(); 
} 
+0

謝謝trutheality - 答案非常簡單: - /我想我不應該在晚上編寫代碼,這往往是一個糟糕的結局。事實上,你是對的 - 我給出的代碼是誤導性的,現在我會糾正它。我很抱歉。這裏有人甚至爲此扣除了我的一些觀點。謝謝你讓我醒來 – roysch

3

您必須在每次循環創建ArrayList的一個新實例。否則,您將繼續將元素添加到同一個內部列表中,並將此唯一內部列表多次添加到外部列表中。

相關問題