【问题标题】:To ArrayList once, or to ArrayList each time?一次到 ArrayList,还是每次都到 ArrayList?
【发布时间】:2013-01-19 18:50:17
【问题描述】:

我有一个具有这样结构的程序。

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?)它的父元素中的位置。一页的元素个数,一章的页数不一致。

在其父级中获取子级的索引很容易,但在祖父级中呢?

由于元素可以(并且通常是)编号,每章有一个编号列表,我必须知道章节中元素的索引,所以我可以在添加新元素时调整数字列表(不必最后添加)。

这可以通过两种方式解决(据我所知,即):

  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.

问题是:哪种方式更好?如果您有更好的想法,可以告诉我,但我想知道以上两种方式中哪种方式更好。

【问题讨论】:

    标签: java arraylist hierarchy


    【解决方案1】:

    你需要做一棵树。出于某种原因,程序员希望将所有内容扁平化为表格结构。您在谈论一棵树,您需要使用一棵或制作一棵。

    遗憾的是,Java 集合中没有任何内容可用于实现树。你可以很容易地制作它们。

    如果树中包含不同的内容,但需要以类似方式处理(作为节点),则执行Composite Pattern 的简单实现。一个很好的例子是文件系统树:每个节点要么是文件夹要么是文件。如果你们都让它们实现了一个名为 FilesystemItem 的接口,那么你可以将它们放入它们的树结构中。

    由于您正在制作文档,因此我建议您使用 Composite。

    【讨论】:

    • 但这需要我为同一事物创建两个结构,一个用于视觉表示,另一个用于计算,这将使我的程序的时间和内存消耗加倍,这两者我试图避免。一棵树能准确地告诉它在每个节点级别上有多少叶子吗?
    • 我不明白双倍的说法。你拥有的是一棵树。每个节点都会有一个对象?
    • 好吧,这不会使争论加倍,但我想你告诉我要做什么已经完成了。 Chapter 是一个 JPanel,它是 Pages 的父级并包含 Pages。 Page 是一个 JPanel,它与 Elements 很相似并包含 Elements。元素是 JPanel。有了这种结构,我就有了一棵树。但是我怎么能确定一个元素相对于章节的索引。检查示例:我想获取与“不,仍然没有”章节相关的索引。相对于它的页面,它有索引2,但相对于章节,它的索引是18)。
    • 所以现在你在谈论一些不同的东西。您现在拥有的是嵌套 ui 组件的树形结构。虽然我是第一个认为 MVC 不是万能的,但您在这里谈论的是等式的两个不同方面:它们是接口组件,您必须有一个文档模型。这就是必须做成一棵树的东西。我知道你要说什么,听起来很浪费,很重复。就是这样完成的,相信我。去看看任何建模文档的框架。
    • 嗯...好吧,摆动组件已经包含了一些模型。使用 getParent() 和 getComponentZOrder(component comp),拥有一个附加模型似乎使事情变得复杂,因为我必须同时更新模型和接口。最重要的是,模型没有给我比界面更多的功能(至少从我需要的一个)。由于我的项目相当小,我想我会坚持只使用接口的方法,尽管我自己的目标是 MVC。我认为只有在达到一定的尺寸和完成度后,它才会在挥杆中发挥作用。
    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2017-02-16
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多