访问ArrayList中的ArrayList时出现ArrayOutOfBoundsException

时间:2013-07-28 18:38:46

标签: java arraylist

使用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.我做错了什么?

3 个答案:

答案 0 :(得分: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的初始容量。它不会像arrays那样修复它的大小。如果您的ArrayList不会非常大,则可以跳过该参数。

  • 我会使用HashMap代替Hashtable Map作为参考类型。 See this post原因。

答案 1 :(得分:2)

当您致电arrays.size()时,您将返回0。该方法返回List中的对象数。因此,您的循环永远不会插入任

当您拨打正在使用的ArrayList构造函数时,int是列表的初始容量 - 这是一项优化,可以提前知道ArrayList的大小将在以后添加项目时防止不必要的大小调整。

答案 2 :(得分: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];  

最高