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。它不会像arrays. 如果您ArrayList的参数不会很大,您可以跳过该参数。

  • 我会使用HashMap而不是HashtablewithMap作为引用类型。看这个帖子的原因。

于 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 回答