我从来没有实现过任何一个编辑器。但对于这么一个我们每天都使用的工具,如何高效的实现其内部结构是一个有趣的话题。首先,
一个高效的算法,以下几点是值得考虑的重点:
1. 所占的空间大小
2. 插入,删除的效率。
最直接的方法是使用一个数组,
数组的每一个成员对应一个相应的字符。这样不需要任何冗余空间,但是缺点也是显而易见的: 每次插入和删除都要进行数组拷贝的动作。
一个初步的提高,
我们是否能够在删除的时候不做这个拷贝动作,
而使用一个特殊的字符来取代。但是我们如何避免在插入时进行数组拷贝的动作呢。这个问题将直接导致两个常用的编辑器数据结构: Gap Buffer 和 Piece
Table.
Gap Buffer:
就是在插入和删除的地方使用一个buffer,这个buffer可以看成在数组中的一个空白区域。这个区域随着编辑器光标的移动而移动。 实例如下:
数组:我们使用 【 】编辑器
^
插入 “文本”
我们使用文本【 】编辑器
^
移动光标至文本之前:
我们使用【 】文本编辑器
^
删除 “文本”:
我们使用【 】编辑器
Gap Buffer 相应的数据结构也很简单:
public class
GapBuffer
{
private int
startGapIndex;
private int
endGapIndex;
private char
[FileSystemPageSize] textBuffer;
}
GapBuffer
在光标移动的时候要进行数组拷贝。所以在文件比较大的时候,通常我们要使用一个链表的GapBuffer来存储文本。在上述的结构中,使用文件系统的page size
来构建buffer。当然我们还需要考虑,合并和扩展buffer的操作。
GapBuffer 的使用者包括Emacs.
Piece Table:
相比较Gap Buffer, Piece Table稍显复杂一些。Piece
Table的实现由两个buffer组成,一个buffer是只读的,另一个buffer是可写的 (只能添加)。每一个Piece
代表了这两个buffer中的一块内存。每一个piece可以表示如下:
public class
Piece
{
private int
bufferIndex;
private int
bufferOffset;
private int
length;
}
最终的文件可以看成所有piece的合在一起。示例如下:
buffer 0:【我们使用编辑器 】
buffer 1:【 】
buffer index
|
offset
|
length
|
0
|
0
|
7
|
插入 “文本”
buffer 0:【我们使用编辑器 】
buffer 1:【文本 】
buffer index
|
offset
|
length
|
0
|
0
|
4
|
1
|
0
|
2
|
0
|
4
|
3
|
删除 “我们”:
buffer 0:【我们使用编辑器 】
buffer 1:【文本 】
buffer index
|
offset
|
length
|
0
|
0
|
4
|
1
|
0
|
2
|
0
|
4
|
3
|
在 piece table 的实现中,两个buffer的内容都不会被删除。每次添加则是在buffer
1中增加一个piece.而每次删除仅仅是改变table的内容。这样的一个好处是我们只需要记住table的变化就可以实现undo和redo了。在每一个piece中加入一些其它的描述符,我们可以记录诸如字体等信息
。 很多文本编辑器都使用这种方法。
分享到:
相关推荐
链串实现的文本编辑器,封装了各种操作的方法,如求长度,插入字符等等。
简单文本编辑器数据结构与算法专业课程设计方案报告.doc
简易文本编辑器数据结构课程设计.doc
数据结构中的文本编辑器..不过要注意这个只是用string类实现的..比较简单......
数据结构课程设计之简单的文本编辑器,完全自创!!
数据结构课程设计之文章编辑器 文章编辑程序 静态存储一页文章,每行最多不超过80个字符,共N行,要求: (1)分别统计出其中英文字母数和空格数及整篇文章总字数; (2)统计某一字符串在文章中出现的次数,并输出...
文本编辑器数据结构的C语言描述(有两个),都可以直接运行,大家有兴趣的可以看看!
设计一个行编辑器,实现如下功能,按菜单形式 1.新建文件(参数:表示文件名字符串) 2.插入行(参数:行号、行内容) 3.删除行(参数:行号) 4.查找/替换(参数:查找的字符串) 5.保存文件。
数据结构与算法——简单的文本编辑器.pdf
此数据结构提供完整的代码和注释,还有运行的整个文件,功能很强大...
(1)编辑器从输入文件读取内容到活区进行行编辑,编辑后将活区的内容写到输出文件。输入输出文件由用户从键盘输入。 (2)“行”的定义:一个换行符到另一个换行符之间为一行。 (3)行编辑的内容包括,(多)行...
数据结构课程的C++行编辑器,对字符串的处理,等等功能。有详细注释。
数据结构行编辑程序
数据结构简单行编辑器课程设计,代码供您参考用
数据结构课程设计报告—文本编辑器.pdf
数据结构 课程设计 图形界面 文本编辑器 源码
数据结构的内容有关于字符串的处理,和将字符串写入与读出文件,设置光标等操作
用数据结构知识实现了行编辑器功能。希望对您的学习有帮助
简单实现一个文本编辑器,使用链表。插入、删除、读写文件