2013-01-19 55 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

相关问题