java中如何合并两个网格_网格中合并(Merge)功能的多种技术方案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java中如何合并两个⽹格_⽹格中合并(Merge)功能的多种技
术⽅案
写这篇⽂章,主要是因为我们的“下午茶时间”(项⽬内部的⼀种交流⽅式)激烈地讨论了此类功能的多种实现,我感觉⾮常有意思。

⼤家可以参考⼀下。

我先简单地描述⼀下功能要求,要求设计⼀种数据结构,⽀持⽹格控件(图形化)实现矩形区域的合并效果(Merged)。

⾮矩形区域的合并不在⽀持范围之内。

⼤家可能都在使⽤各种各样的⽹格控件,最出名的可能是FlexGrid。

不过⼤家可以也思考思考,如果是你的话,你会如何设计呢?
有⼀个最基本的⽅法,每⼀个⽹格CELL中预置⼀个变量:MergeID。

我们姑且将这种⽅法称之为"MergeID法"。

此⽅法规则⽐较简单:没有合并的CELL的MergeID都是0,相邻矩形区域的合并CELLs的MergeID相同,且不为0。

将0特殊处理,是为了加快处理速度,毕竟,⼤多数都是没有合并的CELL。

1
1
1
1
1
1
1
1
1
1
如上⾯的⽹格,则左上⾓六个CELL合并,右下⾓四个CELL合并。

这种⽅法的最⼤问题在于,空间占有⽐较浪费,特别是对那些从没有合并的CELL。

另外,对于合并格的描述不清晰,整个⽹格中有多少合并格也不能简单获取,必须经过遍历才知道。

针对上⾯的分析,提出第⼆种⽅案,我们称之为"MergeRange List",这种⽅法的最⼤优势在于将所有合并的矩形区域统⼀管理起来,形成⼀个列表。

⽹格控件在访问Merge属性的时候,再到Range列表中查找,如果找到,则属于合并格,否则为⾮合并格。

这个⽅式在FlexGrid就被使⽤。

显然这种⽅法⽐较成熟。

不过这种⽅式在管理对象的时候,不容易对应。

需要经过映射。

这在需要⼤量访问⽹格CELL对象的时候,会产⽣⼀些效率浪费。

熟悉HTML的⼈,⼤概还知道HTML的表⽰⽅式,在⽹格上通过rowspan和colspan来定义。

在有合并的CELL的左上⾓上,定义其向右和向下的合并范围。

通过这个范围定义,我们也可以确定合并区域。

这种⽅式的定义简单。

不过实现起来,其实有⼀些问题。

我们上⾯讨论⼏种⽅案的时候,忽略了⼀个问题,那就是我们⼀般的⽹格结构,很可能是⼀个CELL对应⼀个对象。

那样的话,我们可以有⼀个新的⽅案,这个⽅案和第⼀个MergeID⽅案联系在⼀起,但是我们不需要额外的MergeID属性,⽽是直接使⽤Object的对象指针。

只需要判断CELL周围的对象是否相等,就可以知道其合并范围。

合并区域的所有CELL的对象相同。

这样,在取数据的时候,不需要进⾏额外映射。

⽽在⽹格控件绘制的时候,才需要合并区域查找。

效率应该可以满⾜。

我们就将这种⽅法叫"Ojbect/MergeID"吧。

总结列举⼀下四种⽅法:
MergeID
MergeRange List
Span
Object/MergeID
这四种⽅法各有利弊。

其实在我们设计过程中,应该抓住⼀个基本点,要的是空间还是效率,还是两者都要。

不同的要求,使⽤不同的设计。

相关文档
最新文档