c# - 算法问题

标签 c# algorithm

我有以下 5 行字符串:

A.B.C.D.E
A.B
A.B.C
A
A.B.C.D

这是层级关系。例如,第二行表示 B 是 A 的 child 。

现在我想将这些行解析为类结构。这样每个字母都由一个类的实例表示并指向其父级(如果是顶级 (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);
            }
        }

正如预期的那样,这不是我想要的,因为它将所有包添加为顶层。我该如何纠正这个问题?

最佳答案

Package 构造函数的第一个参数是否有可能是父级?如果是这样,您总是在那里传递空值,这可能是您的问题。

顺便说一句,我认为您可以简化您的算法。

不能像这样工作:

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

  }

}

因为保证每一行都被“排序”,所以您知道如果您得到一个尚未添加的包,它的父节点是已添加的最后一个节点。

关于c# - 算法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4339790/

相关文章:

c# - 如何使用用户凭据从 azure 广告生成不记名 token

c# - 已经有一个与此连接关联的打开的 DataReader

c# - 将整个工作簿另存为 PDF Excel 2010 (C#)

c# - 连接到 tfs 并下载其中存在的文件 VS2010

javascript - 在 JavaScript 中从一组已知的潜在 ID 创建唯一字符串 ID/键的快速方法

c++ - for_each 和转换

algorithm - 从两个值生成唯一 ID

c# - WebClient DownloadFile 路径中的非法字符

algorithm - 动态规划问题

r - 循环和聚类