6

我是 Java 新手,所以我不确定这里选择哪种数据结构比较好。我会将加速度计、陀螺仪和磁力计数据(9 个值)存储在一个列表中,以便稍后用于平滑、显示和一些信号处理。

我的想法是创建一个MyObject有十个成员的对象:时间戳和九个方向/运动值,它们都是浮动的。然后,我将数据存储在ArrayList<MyObject>. 这是一个好主意还是我忽略了一些东西?

该列表将最多包含 100k 个值。

4

3 回答 3

1

使用 TreeMap 来提高查找性能。

树状图

注意(在文档中):

此实现为 containsKey、get、put 和 remove 操作提供有保证的 log(n) 时间成本。

于 2013-06-07T20:51:50.027 回答
0

创建自己的课程是正确的方法。现在用于存储该类的对象...

如果您需要在所有对象上直接查找(例如,“给我第 5 个对象”),请使用ArrayList. 但是,如果您只是按顺序遍历所有对象,则应考虑使用链表

该类ArrayList使用一个原始数组,它将根据需要增长以容纳您添加到其中的元素。当它增长其内部结构时,它需要分配一个新数组并复制所有原始值。这可能代价高昂(尤其是 100K 元素!)。您可以给它一个初始大小,以便在它需要增长之前给它更多时间;但是如果你最终不需要那么多空间,ArrayList 的内部数组可能会浪费大量内存。

将元素添加到链表几乎不需要任何成本,因为不需要“增长”;它只是将另一个节点添加到列表中。但是您不能通过索引查找项目。您必须从第一个元素开始并遍历列表到您想要的元素。

于 2013-06-07T21:11:45.157 回答
0

您可能需要考虑使用文件输出流直接输出数据,而不是将其存储在某种数据结构中:

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 之类的程序中,或者实际上几乎可以将其导入任何用于处理数据的程序中。

于 2013-06-07T21:47:30.833 回答