2013-07-28 4 views
0

У меня есть следующая проблема, используя ArrayList из ArrayList. Я делаю следующее:ArrayOutOfBoundsException при доступе к ArrayList внутри 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. Что я делаю неправильно?

+0

Что такое «датчики»? –

+0

Его массив, содержащий перечисление, принадлежащее каждому датчику биомедицинского устройства. – Rafag

ответ

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); 
    

    Кроме того, убедитесь, что лет u знаете, почему вы передаете этот параметр в конструктор ArrayList. Это используется для установки начальной емкости ArrayList. Он не фиксирует его размер, как в случае arrays. Вы можете пропустить этот параметр, если ваш ArrayList не будет очень большим.

  • Я использовал бы HashMap вместо Hashtable с Map как ссылочный тип. See this post по причинам.

+0

Правильно, это должно быть i Rafag

+0

'Карта' под управлением' HashMap'. –

2

При вызове arrays.size() вы получите обратно 0. Этот метод возвращает количество объектов в List. Поэтому ваша петля никогда ничего не вставляет.

При вызове ArrayList конструктор, который вы используете, то int начальная емкость для списка - это оптимизация, когда вы знаете заранее, насколько велика ваша ArrayList будет предотвратить ненужное изменение размера позже при добавлении Предметы.

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)

EDIT: (Не типобезопасен)

Вы также могли бы заменить массивы ArrayList с помощью простого массива:

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

Макс

+1

* поэтому не нужно изменять размер массива каждый раз, когда вы добавляете новую запись. * Поддержанный массив будет пытаться изменять размер каждый раз, когда ему не хватает места для добавления новой записи. –

+0

Небезопасно использовать массивы типичных типов. –

+0

@LuiggiMendoza точно, но я не совсем уверен, как ArrayList обрабатывает массив. Возможно, если вы удалите элемент, он не изменит размер массива сразу, но ждет, чтобы добавить новые элементы. – maxammann

Смежные вопросы