实现文本编辑器的数据结构?

时间:2015-08-25 18:26:27

标签: algorithm data-structures

最近我在接受采访时被问到这个问题。确切的问题是

您将使用哪些数据结构来实现文本编辑器。编辑器的大小可以更改,您还需要保存所有文本的样式信息,如斜体,粗体等?

在那个时间点,我试图说服他使用堆栈,双重链接列表等所有不同的方法。

从那时起,这个问题让我感到困惑。

3 个答案:

答案 0 :(得分:2)

除了之前的答案之外,我想补充一点,为了进入数据结构,您首先需要了解您的设计 - 否则选项将会过于宽泛。

例如,假设您需要编辑功能。这里的StateMemento设计模式非常合适。非常合适的结构将是Cord,因为它是

  

由较小的字符串组成,用于有效地存储和操作非常长的字符串。

在我们的案例中是文本编辑程序

  

可以使用绳索来表示正在编辑的文本,以便可以有效地执行插入,删除和随机访问等操作。

rope

答案 1 :(得分:2)

看起来他们想知道您是否了解flyweight pattern以及如何正确使用它。

文本编辑器是描述该模式的常见示例。

也许你的面试官是GOF书的爱好者。 : - )

答案 2 :(得分:0)

这样一个开放式的问题更多的是为了看看你是否能够有效地思考如何使设计能够很好地结合在一起,而不是只有一个具体的答案。

该问题的一个专门答案是使用DOM / XML(“文档对象模型”)。标记“语言”旨在解决这个确切的问题。您可以将编辑器的数据存储在DOM中。使用DOM的一个优点是,像Xerces这样的库可以为构建和管理DOM提供广泛的支持,因此很多工作都是为您完成的。面试官可能认为这是理想的答案。

更一般的答案是可以使用任何嵌套序列结构。文本可以看作是一系列字符串。序列的每个元素(如数据库中的行)可以具有多个属性(字体类型,字体大小,斜体,粗体,删除线等)。嵌套(层次结构)很有用,因为文档可能具有章节,节,段落等结构。例如,如果一个段落有自己的样式(缩进),那么它可能需要有自己的级别。所以你有这样的事情:

Document
   Chapter
      Paragraph
         Text

要实现这一点,您将使用树,并且树的每个节点都将具有多个属性。您需要不同类型的节点(章节点,段落节点等)。因此,例如,像纸一样的文档在Document节点中会有多个Section节点和一个Notes节点,但类似书的文档可能在文档节点中有章节点。这种方法的优点在于它比使用DOM更具体和手工定制问题,这是一种更灵活的方法。

您还可以将这两种方法结合起来,使用DOM作为基础结构,将上面描述的层次结构作为DOM实现。

(注意:将来你应该将这样的问题发布到https://softwareengineering.stackexchange.com/