合并单元格的数据结构

pabulum 2003-02-19 07:37:29
加精
有一个 行M 列N 的网格

其中相邻i × j 的矩阵的单元格可以合并成一个单元格

请问数据结构如何定义好?
...全文
168 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
bfbd 2003-03-04
  • 打赏
  • 举报
回复
我也累了,这个问题咱还是别争论了。
wpltt 2003-03-04
  • 打赏
  • 举报
回复
解决楼主最后的问题:
1输出的时候不用先定位合并单元格,而是只输出基本单元格(当然要注意长宽变化)。
2基本输出完,输出合并单元格进行覆盖,就不用进行查找了。建议在合并单元格里保有被覆盖的基本格指针,这样保证不会有何遗漏。这个保有动作在进行合并的时候完成。

累了,不想再讨论这个问题,还是结了吧。但是无论如何我总觉得,楼上的方法有点复杂了。
因为有重叠时,我坚决认为只有一层的存在已经足够。
pabulum 2003-02-28
  • 打赏
  • 举报
回复
多谢各位参与

我现在使用vector存放单元格
然后使用list存放合并单元格的信息,结构为:
int rowfrom
int colfrom
int rowto
int colto

其实我要实现的功能远没有大家说得复杂
我只是做报表合并的

我要输出显示的时候,从第一个单元格开始,然后向右向下继续输出
如果发现是合并单元格的话,则从list中取信息


因为可能合并单元格会落在换页的位置,
所以这时合并单元格就会拆分成为多个合并单元格显示
所以我现在对于单元格的数据结构中加入一个是否合并的标志

如果合并的话,就从list中查找看落在哪个合并单元格上
然后得到它的合并信息

现在的问题就是查找会比较费时
如果只是(rowfrom,colfrom)首单元格的话,
我可以使用map来存放合并单元格信息,
对应的key就是行数*100+列数(假设列数不超过100),
这样就能极大的缩短查找时间
可是还要看不是处于(rowfrom,colfrom)的单元格属于哪个合并单元格,
那怎么办,
我现在只能用list存储,然后遍历查找了
zzwu 2003-02-28
  • 打赏
  • 举报
回复
关于 bfbd所提的

用户点击时我得到了鼠标坐标,如果用树结构,
该如何确定选中的是哪一个单元格

问题的回复:

当然选鼠标点击的单元.
如这个单元格位于不同的矩阵中,我们选择首先找到的矩阵中的单元格,
这正好像我们在平台上,点击相互重叠的窗口时,选择的总是位于顶层的那个窗口的元素一样.
wpltt 2003-02-27
  • 打赏
  • 举报
回复
zzwu(未名):图像和单元格毕竟是不一样的东西。图像需要对每一个变动作记录,但单元格不用。不知道我说的对不对。

sliant():我想单元格无限拆分是没有意义的。何况正如bfbd(得失毁誉称讥苦乐-八风不动!) 所说,拆分基础单元格可以看做是插入新的航和列。要知道作软件应该兼顾功能和效率,无限拆分是可能实现的,但是为这个不实用的功能付出代价也要看是否划算。再说了,最强大的表格应该还是excel,excel也没有为无限拆分提供支持。
bfbd 2003-02-27
  • 打赏
  • 举报
回复
拆分基础单元格可以看做是插入新的航和列。
这个操作需要对Map进行重整,
比较费时。

但我想实际应用中拆分的操作次数要
远远小于
搜索合并格和显示合并格的次数。

所以我们设计的数据结构应优先满足和优化使用最频繁的操作。
如果能照顾的多些更好,
如果不能,就只好先凑合了。
毕竟没有万能的解决方案。

sliant 2003-02-26
  • 打赏
  • 举报
回复
如果考虑拆分单元格的话,链表或是 map 适合吗?
sliant 2003-02-26
  • 打赏
  • 举报
回复
wpltt(NullpointException)
如果单元格要无限拆分下去呢?你的基础单元格能拆分吗?
zzwu 2003-02-26
  • 打赏
  • 举报
回复

reportTRUE(防水表):
2个以上矩形相交,则优先级为1,2,3...,也就是单元格(x,y)如属于矩阵1,就是矩阵1,否则才考虑是否属于矩阵2,...

wpltt(NullpointException):
这是受四叉树表示图像的原理的启发提出来的.没有任何其他根据.`
wpltt 2003-02-26
  • 打赏
  • 举报
回复
同意bfbd(得失毁誉称讥苦乐-八风不动!) ,就应该这样做。

不知道 zzwu(未名) 凭什么可以那样的划分树,就拿ab两个区域来说,你为什么认为a和b是同一个级别的呢?

另外,用你的树,不但增加了数据结构的复杂程度,而且遍历算法就一定比散列表快?

再另外,因为拆分时直接回复到原始状态,所以不需要a和b的单独存在,只要有ab的存在就够了,a、b的叶子结点毫无用处,知会增加无用对象的数量


sliant() :
因为单元格的合并不是被destroy,而是被covered,所以无论连表还是map都没有问题。
shitalone 2003-02-26
  • 打赏
  • 举报
回复
进来补课。
reportTRUE 2003-02-25
  • 打赏
  • 举报
回复
同意
bfbd(得失毁誉称讥苦乐-八风不动!)
因为我也是这么做的
bfbd 2003-02-25
  • 打赏
  • 举报
回复
干嘛要用树结构,直接使用一个附加的链表不就OK了!
链表的没一个节点就是一个合并了的单元格的所有基本单元的集合(链表,数组均可)。

无论显示还是选中和编辑,都要搜索这个链表,以确定当前的基本单元格是否被合并过。

为了加快速度,可以把上面的链表改成数组或Map(可以按照键值快速访问的数据结构),然后新建一个Map,其Key为所有被合并过的基础单元格,其Value为合并后的单元格所存储的位置。

wpltt 2003-02-25
  • 打赏
  • 举报
回复
若你使用链表,则不应更改任何abcefg的指针,而应该创建一个新的区域,覆盖这六个单元格。因为你如果更改了指针,拆分时将无法回退。
pabulum 2003-02-25
  • 打赏
  • 举报
回复
我的想法也是用链表

但是链表具体如何链接呢

比如说要合并下面的单元格
a b c
e f g

是让a指向c和e表明合并的大小
还是让b c e f g 都指向a表明要合并到此单元格?
bfbd 2003-02-25
  • 打赏
  • 举报
回复
合并单元格,还要让它不规则?
恐怕真实世界中还没有这个需求吧!

另外,请教未明兄:
用户点击时我得到了鼠标坐标,如果用树结构,
该如何确定选中的是哪一个单元格?

我把链表改成Map的原因就在于此,先确定当前选中的基础单元格,
(根据各列列宽和各行行高进行计算),
再从Map中找出是否合并,以及合并到了哪里,
于是将选中单元格亮显。
计算:
1、行高累计,
2、列宽累计,
3、Map查询
4、显示单元格。
reportTRUE 2003-02-25
  • 打赏
  • 举报
回复
单元格合并后为不规则形状是否有必要呢?
reportTRUE 2003-02-25
  • 打赏
  • 举报
回复
那么你考虑过2个以上矩形相交的情况么?
zzwu 2003-02-25
  • 打赏
  • 举报
回复
为了减少矩阵数目,在以上表示中,允许相邻矩阵有相交的元素,这时,相交部分的元素由前者来规定.
zzwu 2003-02-25
  • 打赏
  • 举报
回复
考察以下的6*10矩阵:

| 0 1 2 3 4 5 6 7 8 9
--------------------------
0 | . . . . e e e . . .
1 | . a a a . . . c c .
2 | . a a a b b . c c .
3 | . a a a b b . c c d
4 | . . . b b b . . d d
5 | . f . . . . . . . .

每个矩阵用左上角的坐标x,y及矩阵的宽度w和高度h四个参数(x,y,w,h)来表示,则有:
Ma=(1,1,3,3)
Mb=(3,2,3,3)
Mc=(7,2,2,3)
Md=(8,3,2,2)
Me=(4,0,3,1)
Mf=(1,5,1,1)

而树是:

Mabcsef +--- Mab +---- Ma =(1,1,3,3)
| |---- Mb =(3,2,3,3)
|
|
+--- Mcd +---- Mc =(7,2,2,3)
| |---- Md =(8,3,2,2)
|
+---- Me =(4,0,3,1)
|
|---- Mf =(1,5,1,1)
加载更多回复(15)

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧