2012-04-21 57 views
1

我打算做一个小程序,它将显示一个图形,每秒更新几次(可能是100/200ms左右)。目的是在图中绘制超过1000个不同的值,有点像XY图。阵列操作,在最后添加元素,推回其他元素

当数组包含1000个元素时,我想在最后添加一个新元素,并在该过程中推回所有其他元素。本质上,元素999将变为998,并且998将变为997 ...一直到第一个元素,这将被简单地扔掉。有没有人有这样做的例子或一个好的算法,无论是与常规数组,Vector,LinkedList或任何其他方法?

我的第一个想法是创建一个新的数组,并将我想要保留的元素复制到新数组中,并抛开前100个元素。在这一点上,我会在数组的最后添加新的100个元素,并不断重复这个过程,但是肯定会有更好的方法来做到这一点?

+1

只需在结尾添加新元素并删除第一个元素? – erikxiv 2012-04-21 18:36:07

回答

1

你所问的是所谓的算法世界双端队列,即双端载体。

这就是你需要的class

基本上deque支持从序列的开头和结尾添加和删除元素。

编辑实际上,当我通读文档时,我惊讶地发现deque的sdk实现不支持直接索引(我习惯在C++中使用这种结构)。所以我继续搜索,发现this answer,链接到this library,这可能对你有帮助。

+0

谢谢,我会尝试使用ArrayDeque实现,因为它具有我需要的此项目的方法。再次感谢您的帮助。 – user1240989 2012-04-21 21:15:58

1

不要使用数组,移动所有元素的复杂性是可怕的!我想说,最适合此任务的Java数据结构是Deque

0

我会继续重用相同的阵列,而只需重新启动之初。为了让自己更清楚,假设你有你的元素阵列1..1000

int[] array = new int[1000]; 
... 
array = {1, 2, ...., 1000 }; 

如果你现在必须添加的,而不是试图有一个数组{2,3,...,1000元1001, ,1001},我会去一个数组{1001,2,3,... 1000},并且只是跟踪我的数组实际启动的索引。这取代了通过简单反驳开始索引来移动所有元素的困难。为了简化你自己,你可以引入一个实用方法

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; 
}