2015-08-25 33 views
7

最近我在一次採訪中被問到這個問題。確切的問題是數據結構實現文本編輯器?

您將使用什麼數據結構來實現文本編輯器。編輯器的大小可以改變,你還需要保存斜體,粗體等所有文本的樣式信息?

在那個時候,我試圖說服他使用許多不同的方法,如堆棧,雙鏈表和所有。

從那時起,這個問題讓我很興奮。

+0

http://stackoverflow.com/questions/4046246/how-are-text-editors-generally-pleplemented –

回答

0

這樣一個開放式問題的設計更多的是爲了看看你是否能夠有意識地設計一個能夠很好地結合在一起的設計,而不是有一個特定的答案。

這個問題的一個專門答案是使用DOM/XML(「文檔對象模型」)。標記「語言」旨在解決這個確切的問題。您可以將編輯器的數據存儲在DOM中。使用DOM的優點之一是像Xerces這樣的庫對構建和管理DOM有廣泛的支持,所以很多工作都是爲你完成的。面試官可能希望這是理想的答案。

更一般的答案是可以使用任何嵌套的序列結構。文本可以看作是一串字符串。序列的每一個元素,如數據庫中的行,都可以有多個屬性(字體類型,字體大小,斜體,粗體,刪除線等)。嵌套(層次結構)很有用,因爲文檔可能具有章節,節,段落等結構。例如,如果一個段落有自己的樣式(縮進),那麼它可能需要有自己的級別。所以,你有這樣的事情:

Document 
    Chapter 
     Paragraph 
     Text 

要實現這一點,你可以使用一棵樹,樹的每個節點將有多個屬性。你會需要不同種類的節點(章節點,段落節點等)。因此,例如,像紙這樣的文檔將在文檔節點內具有多節節點和一個Notes節點,但書類文檔可能在文檔節點內具有章節點。這種方法的優點在於,它比使用DOM更具體和手工定製,這是一種更靈活的方法。

您還可以將這兩種方法結合使用,將DOM用作您的基本結構,並將上述層次結構用作DOM實現。

(注:在未來,你應該張貼類似這樣的問題,https://softwareengineering.stackexchange.com/

2

除了以前的答案,我想補充的是,爲了獲取數據結構,你需要先知道你的設計 - 否則選項將被選得太廣泛。

舉個例子,我們假設你需要一個編輯功能。這裏的StateMemento設計模式將會非常合適。非常合適的結構將是Cord,因爲它是

由較小的字符串組成,用於有效存儲和操作很長的字符串。

在我們的情況下,文本編輯程序

可以用繩子來表示正在編輯的文本,讓如插入,刪除,和隨機存取操作可以有效的進行。

rope

2

看起來,他們想知道,如果你是知道的flyweight pattern以及如何正確地使用它。

在描述該模式時,文本編輯器是一個常見示例。

也許你的面試官是GOF書的愛好者。 :-)

+0

這正是我看來的!享元模式是很多喜歡GoF書籍的採訪者的最愛。你通常也可以在書架上找到這本書的精美封面。 :-) –