Java时间排序数据结构

时间:2016-12-08 13:32:30

标签: java optimization data-structures

我正在处理时间戳事件的高频流,没有订购保证(90%的时间订购)。我需要在我的程序中存储这些事件(用于缓存目的)一段时间。为了优化我的计算性能(主要需要迭代事件集合),如果我可以通过缓存有序列表来保证顺序,那么对我来说会更容易。所以我正在寻找的是一种有序的数据结构,它可以快速插入和迭代并允许重复。

在互联网上找到的所有命题中,我都尝试过:
- TreeSet - >不起作用,因为我可能有重复的时间戳
- PriorityQueue - >不起作用,因为迭代器不保证优先顺序

由于9/10事件排序很好,我想我可以使用带有add方法修改版本的基本ArrayList:

public class TimeOrderedArrayList<E> extends ArrayList<E>{

private long lastTs;
private Comparator<E> comparator;
private TimeGetter<E> tsgetter;

public TimeOrderedArrayList (Comparator<E> comparator, TimeGetter<E> tsgetter) {
    super();
    this.comparator = comparator;
    this.tsgetter = tsgetter;
    this.lastTs = Long.MIN_VALUE;
}


@Override
public boolean add(E e) {
    if (tsgetter.getTime(e) >= lastTs) {
        lastTs = tsgetter.getTime(e);
        return super.add(e);
    } else {

        // VERSION 1
        int index = super.size()-1;
        while (tsgetter.getTime(super.get(index))>tsgetter.getTime(e) && index > 0) {
            index--;
        }
        super.add(index, e);

        // VERSION 2
        int index = Collections.binarySearch(this, e, comparator);
        super.add(index>-1 ? index : -index-1,e);
        return true;
    }
}

@Override
public boolean addAll(Collection<? extends E> c) {
    boolean result = super.addAll(c);
    super.sort(comparator);
    return result;
}
}

但是对于这两个版本我都表现得很糟糕。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我知道你已经驳回了它,但我仍然建议TreeSet

重复时间戳实际上没有问题。唯一的条件是比较器与equals 一致。没什么。

所以是的,在第一种方法中,如果你只是比较事件的时间戳,那么这可能与equals不一致。但是,如果您还要比较事件的其他字段,那么这将与equals一致。

当然,这假定时间戳是事件类E的一部分。

答案 1 :(得分:1)

从问题描述中,在我看来,只要您可以在一段时间内迭代事件集合,严格的顺序对于问题不是强制性的。此外,您提到的数据类型似乎是多个客户端节点将数据发送到一个中央服务器的数据(可能是来自多个服务的日志/事件累积)。

如果是这种情况,您可以使用简单的存储桶阵列进行探索,其中对应于时间戳的事件仅进入特定存储桶。您将确保所有具有非常接近时间戳的事件被分类到相同的存储桶中,以便您可以在事件之间实现部分顺序。

例如:如果您需要最后1分钟(60秒)的数据,您可以定义60个桶,每秒一个,并继续旋转它们。一个事件加时间戳2016-12-08 19:59:29.538331转到第29个桶(假设索引从0开始,你占用每个事件的秒数)。当一分钟过去时,只需清除第i个桶的过去数据,然后重新开始构建。因此,在2016-12-08 20:00:00.129845,第0个桶重置为空数组。

由于您拥有带时间戳事件的高频流,因此空桶等的可能性最小。您可以根据您的具体要求调整所需的存储桶数量。