【发布时间】:2011-07-07 04:27:00
【问题描述】:
我设置了一个树形结构,并希望将其保存到字符串中/从字符串中读取,并使用最少的文本(因此 XML 序列化已被淘汰)。我为此设置了一个简单的(或者我认为是这样的)结构,但不知道如何读取它,所以我的结构很可能不得不改变。让我用一个例子来演示一下。
我的树由 X,Y 坐标组成,如下例所示:
[a,b]
|-----|
[c,d] [e,f]
|-----|-----|
[g,h] [i,j] [k,l]
当我运行我的算法将这棵树变成一个字符串时,我得到以下输出:
a,b(c,d()e,f(g,h()i,j()k,l()))
这里是我正在使用的代码:
public string SerializeMe()
{
StringBuilder ret = new StringBuilder(this.Value.ToString())
ret.Append("(");
foreach (SimpleTreeNode<T> child in _Children)
{
ret.Append(child.SerializeMe());
}
ret.Append(")");
return ret.ToString();
}
这很好用,但现在我无法将字符串解析回我的树结构。我可以将子字符串获取到第一个左大括号并将其转换为节点的值,但我不确定如何将字符串的其余部分拆分为子字符串。有什么方法可以轻松找到一个左大括号,然后找到它的右大括号?我研究了一些复杂的正则表达式,我无法正常工作,很快就完全迷失了。
有人有什么想法吗?
编辑:
这是我到目前为止的代码:
public static SimpleTreeNode<SPoint> ParsePointTree(string input)
{
//if the input string is empty, there is no node here. Return null.
if (string.IsNullOrEmpty(input)) return null;
else
{
//get the value from the first part of the string
string valString = input.Substring(0, input.IndexOf('('));
SPoint value = (SPoint)valString;
SimpleTreeNode<SPoint> node = new SimpleTreeNode<SPoint>(value);
//now we have the child nodes enclosed in brackets
string innerstring = input.Substring(input.IndexOf('('));
List<string> children = new List<string>();
// how do we split innerstring into siblings?? //
foreach (string child in children)
{
node.Children.Add(SimpleTreeNode<SPoint>.ParsePointTree(child));
}
return node;
}
}
我遇到的问题是,我将得到一个必须分成兄弟姐妹的字符串。在上面的示例中,c,d 和 e,f 是兄弟姐妹,以 (c,d()e,f(g,h()i,j()k,l())) 的形式表示。我需要将此字符串拆分为c,d() 和e,f(g,h()i,j()k,l()),这是我卡住的地方。
【问题讨论】:
-
另外,请向我们展示您的解析代码,而不是您的序列化代码...
-
马克·艾略特说得对。请注意,您以递归方式构建了输出。如果您递归地解析它,并且让每个解析级别在您发出的 (...) 对中构造子树,这可能是最简单的。
-
...但是在我们查看您的序列化代码时,请考虑使用
StringBuilder。 -
感谢 StringBuilder 的建议,但我不明白您对我的解析代码的期望。关键是,我不知道该怎么做,因此我还没有解析代码......我想我必须递归解析它,但我遇到的问题是分裂兄弟节点.我可能应该在我的问题中更清楚地说明这一点。