【发布时间】:2014-01-26 21:11:21
【问题描述】:
每隔几毫秒就有一个网络数据流。我需要删除第一个元素,并在发生这种情况时将一个元素添加到固定大小列表的末尾(即“移位”)。元素很简单floats。
我应该使用什么数据结构,有示例用法吗?
【问题讨论】:
每隔几毫秒就有一个网络数据流。我需要删除第一个元素,并在发生这种情况时将一个元素添加到固定大小列表的末尾(即“移位”)。元素很简单floats。
我应该使用什么数据结构,有示例用法吗?
【问题讨论】:
您有多种选择。最简单的方法当然是使用Queue,Java 为您提供了一些实现(arrayblocking、concurrentlinked)。您可以覆盖其中任何一个以添加 shift 方法:
public E shift(E newElement) {
E old = take();
put(newElement);
return old;
}
为了使这个线程安全,你需要一些同步。
如果出于某种原因,您更喜欢其他系列,这也是可能的。请注意,这些可能不是线程安全的。由于相当糟糕的复杂性,我不会使用 ArrayList,但 LinkedList 应该没问题。覆盖它需要这种转变:
public E shift(E newElement) {
E old = getFirst();
addLast(newElement);
return old;
}
只要只使用 shift 方法,就可以确定固定大小。如果你想强制它,你将不得不覆盖更多的方法,使用委托。
【讨论】:
我不完全知道您想如何访问这个不断变化的队列中的数据,但我建议使用 LinkedBlockingQueue<Float> 或 ArrayBlockingQueue<Float> 以及一个等待和处理输入的线程。您可以从任何线程(例如您的网络线程)将元素添加到队列中,并在元素可用时对其进行处理。这样可以保证您不会像当前方法那样丢失任何数据(因为如果写入的元素多于处理的元素,数据将会丢失,除非您在处理数据时阻止写入)。
【讨论】: