2015-01-01 44 views
0

所以我有一个数据结构,看起来像:偏移到树

{ 
    "text": "hello world!", 
    "tags": [{"start": 0, "end": 4, "tag": "b"}, {"start": 1, "end": 5, "tag": "i"}] 
} 

而且我希望把它变成的东西,看起来像这样:

[["b", [ 
    ["#text", "h"], 
    ["i", ["#text", "ello"]]]] 
,["i", ["#text", " "]] 
,["#text", "world!"]] 

(是的,这是一种的抽象表示形式,它看起来像是一棵DOM树。)

我不确定甚至开始接近这个的正确方法是什么。 。 。有任何想法吗?

+2

它看起来像你将不得不知道“我”部分包含在“b”使用它?只是试图理解为什么这可能是一个理想的东西 – asimes

+0

是的,你知道从“开始”和“结束”偏移量(约束是0到4的文本必须是“b” ,从1到5的文本必须是“我”的孩子)。 –

+0

你的例子有不平衡的方括号,它是不明显的如何解决它,你可以平衡它,然后再次发布? – asimes

回答

0

也许添加新标签的方法可能通过类似于深度优先搜索的过程完成。最初的数据结构将只是一个单一的叶节点:

[ 
    ["#text", "hello world!"] 
] 

添加的第一个标签将是迄今分裂的唯一节点为两个节点,其中一个有标记“B”。在现实中被添加了新的元素和唯一的节点的字符串被做成了什么,这是一个字符串:

[ 
    ["b", 
     ["#text", "hello"] 
    ], 
    ["#text", " world!"] 
] 

归纳的过程中,叶节点包含原始文本和非叶节点的子串是标签。当添加另一个标签时,执行深度优先搜索,同时还保持到目前为止所看到的子串的长度的总和

当搜索在上述结构中输入“b”时,子串总和长度将为0.在添加该节点的字符串(“你好”)的长度的串长度将成为5.由于范围“I”重叠0 - 5“b”节点必须被分割暂时产生:

[ 
    ["b", 
     ["#text", "h"], 
     ["i", 
      ["#text", "ello"] 
     ] 
    ], 
    ["#text", " world!"] 
] 

然而深度第一次搜索没有完成“i”标记,下一个节点(标记为“#text”)仍然必须被分割。当进入该节点时,当前的子串长度将是5,并且在添加该节点的文本(“世界!”)后将变为12。 “i”是5的范围内 - 这是上分裂生产节点12:

[ 
    ["b", 
     ["#text", "h"], 
     ["i", 
      ["#text", "ello"] 
     ] 
    ], 
    ["i", 
     ["#text", " "] 
    ], 
    ["#text", "world!"] 
] 

注意,括号内是从你在你的问题贴什么略有不同。我认为原支架问题(在评论中提到)不是最后一个支架