-1

此代码是根据真实性的建议编辑的。

我很难为这个标题想出一个好的标题——如果你有更好的主意,请随时更改它。

我正在创建一个二维 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 用户引用,当我使用 clear() 时,我也丢失了 2D ArrayList 中的值。

如何每次都获得一个新的 ArrayList,这样当我填满 2D ArrayList 时,我就不会复制 1D ArrayList 的内容?

我感谢任何帮助,D

4

2 回答 2

3

您必须在循环的每次迭代中创建一个新的 ArrayList 实例。否则,您将继续向同一个内部列表添加元素,并将这个唯一的内部列表多次添加到外部列表中。

于 2012-05-05T20:01:21.920 回答
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,而不是oneD ArrayListtwoD. 解决方法很简单:在循环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();
}
于 2012-05-05T22:00:24.517 回答