2012-05-05 124 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的一个新实例。否则,您将继续将元素添加到同一个内部列表中,并将此唯一内部列表多次添加到外部列表中。

相关问题