我有一个具有这样结构的程序。
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或类似的东西)。每个单独的元素都有一个索引,表示它在(on?)它的父级的位置。页面中的元素数量和章节中的页面不一致。
很容易将孩子的索引纳入其父母的内容,但是它的祖父母呢?
由于元素可以(通常是)编号,每章有一个编号列表,我必须知道章节中元素的索引,所以我可以在添加新元素时调整数字列表(最后不必添加)。
这可以通过两种方式解决(我知道,即):
每章都有一个ArrayList,用于保存所有元素。每次我向任何页面添加一个新元素时,这都需要我将它添加到章节数组中。 为了实现这一点,我必须通过所有前面的页面,将它们上的所有元素相加,并将当前页面上新元素的索引添加到该数字,结果是本章中新元素的索引,因此,在阵列中。每次添加新元素时都要这样做。
每次我需要获取章节中元素的顺序时,重新创建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.
问题是:哪种方式做得更好?如果你有更好的想法,你可以告诉我,但我想知道上述两种方式哪种方式更好。
答案 0 :(得分:2)
你需要做一棵树。出于某种原因,程序员希望将所有内容压缩成表格结构。你在谈论一棵树,你需要使用一棵树或制作一棵树。
遗憾的是,Java Collections中没有任何实现Trees的功能。你可以很容易地制作它们。
如果树中包含的内容不同,但需要对其进行类似处理(作为节点),则执行Composite Pattern的简单实现。一个很好的例子是文件系统树:每个节点都是文件夹或文件。如果你们都让它们实现了一个名为FilesystemItem的接口,那么你可以将它们放入它们的树结构中。
由于您正在撰写文档,我建议使用Composite。