您可以避免缓存所有内容,并且只通过在头上窥视来对流进行太多查找,并且只在需要时才这样做。我建议你写一个MergedEventStream
类似于此:
public class MergedEventStream implements EventStream {
private ArrayList<EventStream> merged = new ArrayList<EventStream>();
private int nextIndex = -1;
public MergedEventStream(Collection<EventStream> toMerge) {
merged.addAll(toMerge);
findNext();
}
public Event peek() {
if (nextIndex == -1 && findNext() == false) {
throw new NoSuchElementException();
} else {
Event e = merged.get(nextIndex).peek();
return e;
}
}
public Event peek() {
if (nextIndex == -1 && findNext() == false) {
throw new NoSuchElementException();
} else {
Event e = merged.get(nextIndex).next();
findNext();
return e;
}
}
/**
* iterates over merged, and for each stream with an available event,
* adds it to a sorted TreeMap<Event, Integer> (sorting by any event field; integer
* is stream index in arrayList)
* if set is not empty, returns 'true', and sets nextIndex to the stream index
* otherwise, returns 'false', and sets nextIndex to -1
*/
private boolean findNext() {
// ...
}
}
您可以通过保持树形图作为一个实例属性,只刷新那些你从提取物物流提高效率一些。
听起来就像你想要一个排序的堆而不对其进行排序。 – Shark