使用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 :(得分: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];
最高