您可以避免緩存所有內容,並且只通過在頭上窺視來對流進行太多查找,並且只在需要時才這樣做。我建議你寫一個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