我有以下5行字符串:
A.B.C.D.E
A.B
A.B.C
A
A.B.C.D
这是等级关系。例如,第二行表示B是A的子节点。
现在我想将这些行解析为类结构。这样每个字母都由一个类的实例表示并指向其父级(如果是顶级(A)则为null)。但是,每个字母只应加一次。
我开始了以下内容:
String[] hierarchical = Name.Split('.');
if (hierarchical.Count() > 1)
{
Console.WriteLine("Package '" + Name + "' is not top level and has to be parsed");
Console.WriteLine("Find parent for '" + hierarchical[hierarchical.Count() - 1] + "'");
findParent(Name);
}
else
{
Console.WriteLine("Package '" + Name + "' is top level and is added to the manager");
if (!manager.isAlreadyAdded(Name))
{
Package p = new Package(null, hierarchical[0], Name);
manager.add(p);
}
}
}
这意味着如果它是顶级名称(上例中的A),则将其添加到管理器(如果它尚不存在)。问题在于findParent()方法,我试图找到子包的父级:
private void findParent(String path)
{
String originalPath = path;
bool found = false;
while (!found)
{
int position = path.LastIndexOf(".");
if (position == -1)
{
Console.WriteLine("Top level reached: " + path);
if (!manager.isAlreadyAdded(path))
{
Package p = new Package(null, path, path);
manager.add(p);
}
found = true;
}
else
{
path = path.Substring(0, position);
Console.WriteLine("Path: " + path);
if (!manager.isAlreadyAdded(path))
{
Package p = new Package(null,getName(path), path);
manager.add(p);
}
}
}
}
private string getName(string path)
{
int position = path.LastIndexOf(".");
if (position == -1)
{
return path;
}
else
{
return path.Substring(position+1, path.Length - position - 1);
}
}
正如预期的那样,这不是我想要的,因为它将所有包添加为顶级。我怎么能纠正这个?
答案 0 :(得分:2)
包构造函数的第一个参数是否是父母的任何机会?如果是这样,那么你总是在那里传递null,这可能是你的问题。
不过,我认为您可以简化算法。不能像这样工作:
String[] hierarchical = Name.Split('.');
foreach (String node in hierarchical){
if(!manager.Contains(node)){
manager.AddToEnd(node); //adds node who's parent is the last node added
}
}
由于每一行都保证“排序”,你知道如果你得到一个尚未添加的包,它的父节点就是已添加的最后一个节点。
答案 1 :(得分:0)
我对你要做的事情有点不清楚,但这会将parent
设置为列表中倒数第二个(节点):
string[] nodes = path.Split(".".ToCharArray());
string parent = nodes[nodes.Length - 2];