我有一个字符串数组,其中包含来自HTML标记的文本...
String[] Headers = {"H1", "H1", "H2", "H3", "H3", "H2", "H2", "H3", "H4", "H2", "H2", "H2", "H1", "H2", "H2", "H3", "H4", "H4", "H2" };
我需要将这段内容转化为树形结构。其中,任何Hn都是最近的Hn-1的子级。
ROOT
H1
H1
...H2
......H3
......H3
...H2
...H2
......H3
.........H4
...H2
...H2
...H2
H1
...H2
...H2
......H3
.........H4
.........H4
...H2
这似乎应该使用递归完成,而且当我看到解决方案时,我会为自己没有早些想到而后悔。 有人能给我一个解决方案吗?
更新:因此,我尝试了几个变量的递归,但完全没有运气。事实证明,我使这个问题变得比必须的更难。
由于出现了一个测试用例,
String [] Headers = {"H1",“H1”,“H3”,“H3”,“H5”,“H4”,“H4”,“H4”};
我对bcorso的答案进行了微小的修改,以下是我的最终版本:
private void addChildren(TocItem root, Elements headers) {
if(headers == null || headers.size() == 0) return;
Map<Integer, TocItem> mostRecent = new HashMap<Integer, TocItem>(headers.size());
int startLevel = getTagLevel(headers.get(0)) - 1;
mostRecent.put(startLevel, root);
for(int i = 0; i < headers.size(); i++) {
Element htag = headers.get(i);
int level = getTagLevel(htag);
TocItem next = new TocItem(htag, level);
int offset = 1;
TocItem parent = mostRecent.get(level - offset);
while(parent == null && offset < level) {
offset++;
parent = mostRecent.get(level - offset);
}
if(parent != null) {
parent.addChild(next);
}
mostRecent.put(level, next);
}
}