0

ArrayListofを使用して次の問題がありArrayListます。私は次のことをします:

Hashtable<SensorType, ArrayList<Float>> hash = new Hashtable<SensorType, ArrayList<Float>>();

int numKeys = sensors.size();
ArrayList<ArrayList<Float>> arrays = new ArrayList<ArrayList<Float>>(numKeys);  

for(int i = 0; i < arrays.size(); i++){
    ArrayList<Float> aux = new ArrayList<Float>();
    arrays.add(aux);
}

String columns = getColumnsName(sensors);

String sql = "select " + columns + " from " + nameTable + " where " + ID + " BETWEEN " +
    start + " AND " + end + ";"; 

Cursor c = db.rawQuery(sql, null);      
c.moveToFirst();

while(!c.isAfterLast()){

    for(int i = 0; i < numKeys; i++)
        arrays.get(i).add(c.getFloat(i));

    c.moveToNext();
}

これは常に私にArrayOutOfBoundsException. すべての配列 (内側) のサイズが 0 であることを示しています。何が間違っていますか?

4

3 に答える 3

2

このループ:

for(int i = 0; i < arrays.size(); i++){
    ArrayList<Float> aux = new ArrayList<Float>();
    arrays.add(aux);
}

一度も実行されません。以来arrays.size()です0。だから、あなたarraysは空だけです。したがって、その例外が発生します。

ループを次のように変更する必要があると思います。

for(int i = 0; i < numKeys; i++)

それとは別に、私はあなたのコードにいくつかの変更を加えます:

  • リストを次のように宣言します。

    List<List<Float>> arrays = new ArrayList<List<Float>(numKeys);
    

    ArrayListまた、そのパラメーターをコンストラクターに渡す理由を確認してください。の初期容量設定に使用しますArrayList。の場合のようにサイズが固定されませんarraysArrayListあまり大きくない場合は、そのパラメーターをスキップできます。

  • withHashMapの代わりに参照型として使用します。理由については、この投稿を参照してください。HashtableMap

于 2013-07-28T18:42:26.927 に答える
2

電話arrays.size()すると折り返し0ます。このメソッドは、 内のオブジェクトの数を返しますList。したがって、ループは何も挿入しません。

ArrayList使用しているコンストラクターを呼び出すとき、 はリストの初期容量です。これは、項目を追加するときに後で不要なサイズ変更を防ぐために、intどれくらいの大きさになるかを事前に知っている場合の最適化です。ArrayList

于 2013-07-28T18:42:29.967 に答える
0
int numKeys = sensors.size();
ArrayList<ArrayList<Float>> arrays = new ArrayList<ArrayList<Float>>(numKeys);  

for(int i = 0; i < arrays.size()/*<- This returns 0*/; i++){
    ArrayList<Float> aux = new ArrayList<Float>();
    arrays.add(aux);
}

arrays.size() が 0 を返すのはなぜですか?

numKeysをArrayListのコンストラクターに渡すと、バッキングされた配列が調整されるだけなので、新しいエントリを追加するたびに配列のサイズを変更する必要はありません。新しいエントリを追加していないため、arrays.size() は 0 を返します。したがって、arrays.size()numKeysに置き換えます。初期サイズは、リストの実際のサイズとは関係ありません。

Javadoc: http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList(int)

編集:(タイプセーフではありません)

配列 ArrayList を単純な配列に置き換えることもできます。

ArrayList<Float>[] arrays = new ArrayList<Float>[numKeys];  

マックス

于 2013-07-28T18:46:56.857 に答える