哪种数据结构对Java中的时间序列数据是否合理?

时间:2013-06-07 20:44:12

标签: java data-structures

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

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

该列表最多可保留100k值。

3 个答案:

答案 0 :(得分:1)

使用TreeMap开始提高查找性能。

TreeMap

注意(在文档中):

  

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

答案 1 :(得分:0)

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

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

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

向链表添加元素几乎不需要任何费用,因为不需要“增长”;它只是在列表中添加了另一个节点。但是你无法通过索引查找项目。你必须从第一个元素开始,然后遍历列表到你想要的元素。

答案 2 :(得分:0)

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

output = new BufferedWriter(new FileWriter("output.csv"));

while(dataSource.stillHasData())
    output.println(dataSource.getData().toString());

output.close();

使用BufferedWriter可确保程序在获取下一个数据之前不必等待磁盘写入,因此这对于收集实时数据(通常)是可接受的。

然后,您应该在数据类中执行以下操作:

public String toString(){
    StringBuilder buf = new StringBuilder();

    buf.append(timeStamp); str.append(',');
    // ...
    // append all the other data

    return buf.toString();
}

这样做的好处是你可以将它导入到像excel这样的程序中,或者实际上只是用于处理数据的任何程序。