我打算做一个小程序,它会显示一个图表,每秒钟会更新几次(可能是100 / 200ms左右)。目的是在图中绘制超过1000个不同的值,有点像XY图。
当数组包含1000个元素时,我想在最后添加一个新元素,并在此过程中将所有其他元素推回一步。本质上,元素999将变为998,而998将变为997 ......一直到第一个元素,它将被简单地丢弃。有没有人有一个例子或一个好的算法来做这个,使用常规数组,Vector,LinkedList或任何其他方法?
我的第一个想法是创建一个新数组并将我想要保留的元素复制到新数组中,扔掉前100个元素。此时,我将在数组末尾添加新的100个元素,并继续重复此过程,但肯定必须有更好的方法吗?
答案 0 :(得分:1)
你所问的在算法世界中被称为deque,即双端向量。
这是您需要的class。
基本上deque支持在序列的开头和结尾添加和删除元素。
编辑实际上,当我阅读文档时,我惊讶地发现deque的sdk实现不支持直接索引(我习惯在C ++中使用这种结构)。所以我一直在搜索,找到this answer,链接到this library,,这可能对你有所帮助。
答案 1 :(得分:1)
不要使用数组,移动所有元素的复杂性太可怕了!我认为,最适合此任务的Java数据结构是Deque。
答案 2 :(得分:0)
我会继续重复使用相同的数组,并在开始时重新启动。为了使自己更清楚,假设您的数组包含元素1..1000
int[] array = new int[1000];
...
array = {1, 2, ...., 1000 };
如果您现在必须添加元素1001,而不是尝试拥有数组{2,3,...,1000,1001},我会选择数组{1001,2,3,... 1000并且只是跟踪我的数组实际开始的索引。这通过保持与begin-index的简单计数器来替换移动所有元素的难度。为了方便自己,您可以引入实用方法
private int startIndex = 1;//0 at the start
//I assume we are in the situation with array {1001, 2, 3, ..., 1000 }
public int convertIndex( int index ){
return (index + startIndex) % 1000;
}