对不起,我只是个初学者。 我使用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
结果永远不会改变
答案 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");
}
}