社区
数据结构与算法
帖子详情
合并单元格的数据结构
pabulum
2003-02-19 07:37:29
加精
有一个 行M 列N 的网格
其中相邻i × j 的矩阵的单元格可以合并成一个单元格
请问数据结构如何定义好?
...全文
168
35
打赏
收藏
合并单元格的数据结构
有一个 行M 列N 的网格 其中相邻i × j 的矩阵的单元格可以合并成一个单元格 请问数据结构如何定义好?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
jasperReport 动态
合并单元格
示例
jasperReport 动态
合并单元格
示例
vue-easytable
合并单元格
vue-easytable
合并单元格
,文档包括ftl文件及对应的js
layui table
合并单元格
.zip
layui table
合并单元格
.zip 跨行自动
合并单元格
C# DataGridView
合并单元格
C# DataGridView
合并单元格
易语言
合并单元格
易语言
合并单元格
源码,
合并单元格
数据结构与算法
33,025
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章