2013-01-19 52 views
1

我有一個這樣的結構的程序。每次ArrayList一次或ArrayList?

Document which contains (up to 20) 
Chapters which contain (up to 100) 
Pages which contain (up to 20) 
Elements 

該結構在我的程序中由JPanels表示。這意味着這個結構必須在視覺上表現出來,而且我寧願不製作一個完整的ArrayList複合體(除非絕對必要),因爲每個JPanel都有一個ZOrder組件和一個getParent()方法。

這個結構是一維的,意思是它的子對象有一個一維數組(當我說數組時,它純粹是描述性的,我不是指ArrayList或類似的東西)。每個單獨的元素都有一個索引,表示它的位置(在?上)它是父級。頁面中的元素數量和章節中的頁面數量不一致。

在孩子的父母身上很容易找到孩子的索引,但那是爺爺奶奶呢?因爲元素可以是(通常是)編號,每章有一個編號列表,所以我必須知道章節中元素的索引,所以我可以在添加新元素時調整數字到列表中(最後不需要添加)。

這可以通過兩種方式來解決(我知道的,這是):

  1. 有在保留所有元素每章一個ArrayList。這需要我這樣做,每次我向任何頁面添加一個新元素,將其添加到章節數組中。 爲了達到這個目的,我必須去掉所有前面的頁面,將它們上的所有元素相加,並將當前頁面上新元素的索引添加到該數字,結果是該章節中新元素的索引,因此,在數組中。每次添加新元素時都要這樣做。

  2. 每次我需要獲取章節中元素的順序時,重新創建arrayList。這也意味着每一頁都會變得越來越緊密,並且每個元素都會一個接一個地添加,直到我到達章節的最後。每次添加新元素時我都需要它。

所以問題是,這兩種方法哪一種更好(更高效的內存或處理器時間明智)?哪一個更符合Java和編程的精神?有沒有第三種選擇,我不知道?

章例如:

Page one { 
1. something 
2. more something 
3. nothing 
. 
. 
. 
16. still nothing 
} 

Page two { 
17. maybe something 
18. nope, still nothing 
. 
. 
. 
21. giberish 
} 
etc. 

的問題是:這樣做是更好的哪種方式?如果你有更好的主意,你可以告訴我,但我想知道以上兩種方式哪種更好,哪種方式更好。

回答

2

您需要製作一棵樹。出於某種原因,程序員希望將所有東西都拼湊成表格結構。你在談論一棵樹,你需要使用一個或者做一個。

不幸的是,Java集合中沒有任何東西可以實現樹。你可以很容易地製作它們。

如果樹中包含的內容不同,但需要對其進行類似處理(以節點形式),請執行Composite Pattern的簡單實施。一個很好的例子是文件系統樹:每個節點都是文件夾或文件。如果你們有他們實現一個名爲FilesystemItem的接口,那麼你可以把它們放到它們的樹結構中。

既然你正在做一個文檔,我會推薦Composite。

+0

但是,這將需要我爲同一件事創建兩個結構,一個用於視覺表示,另一個用於計算,這將使我的程序的時間和內存消耗翻倍,這兩個我都試圖避免。一棵樹可以精確地告訴每個節點級別有多少葉子? – Karlovsky120

+0

我不明白雙重論點。你有什麼是一棵樹。每個節點都會有一個對象? – Rob

+0

好吧,它不會讓爭論翻番,但我想,你告訴我要做的事情已經完成了。 章是一個JPanel,它是父頁幷包含Pages。 Page是一個JPanel,它包含元素,並且包含元素。元素是JPanels。 有了這個結構,我有一種樹。但是我怎麼能確定一個元素相對於一個章節的索引。檢查示例:我想獲得相對於「nope,還沒什麼」一章的索引。相對於它的頁面,它有索引2,但相對於該章節,其索引是18)。 – Karlovsky120

相關問題