我是 Java 新手,所以我不确定这里选择哪种数据结构比较好。我会将加速度计、陀螺仪和磁力计数据(9 个值)存储在一个列表中,以便稍后用于平滑、显示和一些信号处理。
我的想法是创建一个MyObject
有十个成员的对象:时间戳和九个方向/运动值,它们都是浮动的。然后,我将数据存储在ArrayList<MyObject>
. 这是一个好主意还是我忽略了一些东西?
该列表将最多包含 100k 个值。
我是 Java 新手,所以我不确定这里选择哪种数据结构比较好。我会将加速度计、陀螺仪和磁力计数据(9 个值)存储在一个列表中,以便稍后用于平滑、显示和一些信号处理。
我的想法是创建一个MyObject
有十个成员的对象:时间戳和九个方向/运动值,它们都是浮动的。然后,我将数据存储在ArrayList<MyObject>
. 这是一个好主意还是我忽略了一些东西?
该列表将最多包含 100k 个值。
创建自己的课程是正确的方法。现在用于存储该类的对象...
如果您需要在所有对象上直接查找(例如,“给我第 5 个对象”),请使用ArrayList
. 但是,如果您只是按顺序遍历所有对象,则应考虑使用链表。
该类ArrayList
使用一个原始数组,它将根据需要增长以容纳您添加到其中的元素。当它增长其内部结构时,它需要分配一个新数组并复制所有原始值。这可能代价高昂(尤其是 100K 元素!)。您可以给它一个初始大小,以便在它需要增长之前给它更多时间;但是如果你最终不需要那么多空间,ArrayList 的内部数组可能会浪费大量内存。
将元素添加到链表几乎不需要任何成本,因为不需要“增长”;它只是将另一个节点添加到列表中。但是您不能通过索引查找项目。您必须从第一个元素开始并遍历列表到您想要的元素。
您可能需要考虑使用文件输出流直接输出数据,而不是将其存储在某种数据结构中:
output = new BufferedWriter(new FileWriter("output.csv"));
while(dataSource.stillHasData())
output.println(dataSource.getData().toString());
output.close();
使用 aBufferedWriter
可确保程序在获取下一个数据之前不必等待磁盘写入发生,因此这对于收集实时数据(通常)是可以接受的。
然后你应该在你的数据类中做这样的事情:
public String toString(){
StringBuilder buf = new StringBuilder();
buf.append(timeStamp); str.append(',');
// ...
// append all the other data
return buf.toString();
}
这种方式的优势在于,您可以将其导入到诸如 excel 之类的程序中,或者实际上几乎可以将其导入任何用于处理数据的程序中。