2012-04-21 68 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; 
}