关于Arraylist的一些问题

时间:2013-12-06 07:51:55

标签: java android arrays arraylist

对不起,我只是个初学者。 我使用ArrayList来保存手机传感器的结果。

ArrayList<Float> b = new ArrayList<Float>(); //save

我创建了20个项目。

private void ini() {
    // TODO Auto-generated method stub
    for (int i = 0; i <= 20; i++) {
        b.add(i, (float) 0);
    }
}

这是我的传感器代码的网站。我需要将所有旧结果转移到左侧数组,而传感器的结果正在更新。头部阵列的结果将被销毁。最新的结果将放在最后一个数组上。

private SensorEventListener aL = new SensorEventListener() {

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {
        // TODO Auto-generated method stub

    }

    public void onSensorChanged(SensorEvent arg0) {
        // TODO Auto-generated method stub
        textx.setText("X:" + String.valueOf(arg0.values[0])); // X
        texty.setText("Y:" + String.valueOf(arg0.values[1])); // Y
        textz.setText("Z:" + String.valueOf(arg0.values[2])); // Z
        try {
            b.add(19, (float) arg0.values[1]);
            Log.e("set", "" + b.get(19));
            data();
        } catch (Exception obj) {
            Log.e("err", "err");
        }

    }

    public void data() {
        for (int i = 1; i <= 19; i++) {// result left
            b.add((i - 1), b.get(i));
            Log.e("set", "" + i + " " + b.get(i));
        }
    }

};

但这是结果

12-06 02:42:03.778: E/set(3281): 9.77622 //Log.e("set",""+b.get(19));
12-06 02:42:03.778: E/set(3281): 1 0.0   //Log.e("set",""+i+" "b.get(i));
12-06 02:42:03.778: E/set(3281): 2 0.0
12-06 02:42:03.788: E/set(3281): 3 0.0
12-06 02:42:03.808: E/set(3281): 4 0.0
12-06 02:42:03.808: E/set(3281): 5 0.0
12-06 02:42:03.818: E/set(3281): 6 0.0
12-06 02:42:03.818: E/set(3281): 7 0.0
12-06 02:42:03.818: E/set(3281): 8 0.0
12-06 02:42:03.849: E/set(3281): 9 0.0
12-06 02:42:03.849: E/set(3281): 10 0.0
12-06 02:42:03.849: E/set(3281): 11 0.0
12-06 02:42:03.879: E/set(3281): 12 0.0
12-06 02:42:03.879: E/set(3281): 13 0.0
12-06 02:42:03.879: E/set(3281): 14 0.0
12-06 02:42:03.889: E/set(3281): 15 0.0
12-06 02:42:03.899: E/set(3281): 16 0.0
12-06 02:42:03.899: E/set(3281): 17 0.0
12-06 02:42:03.929: E/set(3281): 18 0.0
12-06 02:42:03.929: E/set(3281): 19 0.0

结果永远不会改变

4 个答案:

答案 0 :(得分:0)

为什么不把这个值插入0。

根据docs

将指定元素插入此列表中的指定位置。 转移当前位于该位置的元素(如果有)以及右侧的任何后续元素(将其添加到其索引中)。

E.g

 data.add(0, Float.valueOf(value));
 if (data.size () > 20) {
    data.remove (20);
 }

使用此解决方案,如果将20作为参数传入,则可以实时缩小和增加数据的长度而不会丢失它。

还要反转您的数据 使用

Collections.reverse(data);

答案 1 :(得分:0)

请注意..

    for (int i = 1; i <= 19; i++) {// result left
        b.add((i - 1), b.get(i));  
        Log.e("set", "" + i + " " + b.get(i));
    }

您从第0个索引更新。但是您从第1个索引打印。所以价值可能会更新。但是您不记录日志更新的值。所以这样打印..

 Log.e("set", "" + i-1 + " " + b.get(i-1));

答案 2 :(得分:0)

如果您需要循环缓冲区(如实现),为什么不在列表末尾添加新值并删除第一个(索引为0)?你可以:

private void addNewValue(List<Float> data, float value) {
    final int MAX_DATA_SIZE = 20;
    data.add(Float.valueOf(value));
    if(data.size() > MAX_DATA_SIZE) {
        data.remove(0);
    }
}

并且还使用链表,因为它可以更快地适用于这种情况:

List<Float> data = new LinkedList<Float>();

答案 3 :(得分:0)

使用remove删除第一个元素,然后使用add arraylist末尾的新元素

public void onSensorChanged(SensorEvent arg0) {
    // TODO Auto-generated method stub
    textx.setText("X:" + String.valueOf(arg0.values[0])); // X
    texty.setText("Y:" + String.valueOf(arg0.values[1])); // Y
    textz.setText("Z:" + String.valueOf(arg0.values[2])); // Z
    try {
        b.remove(0);
        b.add(19, (float) arg0.values[1]);
        Log.e("set", "" + b.get(19));
    } catch (Exception obj) {
        Log.e("err", "err");
    }
}