-1

このコードは、真実性からのアドバイスに従って編集されました。

このタイトルの良いタイトルを思いつくのに苦労しています。もっと良いアイデアがあれば、遠慮なく変更してください。

2次元の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()を使用すると、2DArrayListの値も失われます。

2D ArrayListをいっぱいにしたときに、1D ArrayListの内容を複製しないように、毎回新しい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 ArrayListtwoDoneD 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 に答える