我每隔几毫秒就有一个网络数据流。我需要删除第一个元素,并在发生这种情况时将一个元素添加到固定大小的列表的末尾(即" shift")。元素很简单float
。
我应该使用哪种数据结构,是否有示例用法?感谢。
答案 0 :(得分:0)
你有几种选择。最简单的当然是使用Queue
,Java为您提供了一些实现(arrayblocking,concurrentlinked)。您可以覆盖其中任何一个以添加移位方法:
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方法,就可以确定固定大小。如果你想强制它,你将不得不覆盖更多的方法,使用委托人。
答案 1 :(得分:0)
我并不完全知道您希望如何从这个不断变化的队列中访问数据,但我建议使用LinkedBlockingQueue<Float>
或ArrayBlockingQueue<Float>
以及要等待的线程。过程输入。您可以从任何线程(例如您的网络线程)向队列添加元素,并在元素可用时处理它们。这样就可以保证不会丢失任何数据,这与当前的方法不同(因为如果写入的元素多于处理的数据,则数据会丢失,除非您在处理数据时阻止写入)。