【问题标题】:Help to write an algorithm for folders structure帮助编写文件夹结构的算法
【发布时间】:2011-09-15 15:29:03
【问题描述】:

我正在使用 MongoDB,我需要编写一个算法来填充以下类,以构建树目录结构:

public class Dir 
{
    public string name { get; set; }
    public string hash { get; set; }
    public bool read { get; set; }
    public bool write { get; set; }
    public Dir[] dirs { get; set; }
}

我将从 MongoDB 中得到一个这样的文件夹的列表字符串,不同且排序(空字符串是根):

 Folder1
 Folder2
 Folder2/ChildFolder
 Folder2/ChildFolder2
 Folder2/ChildFolder3
 Folder2/ChildFolder3/Folderrrr
 Folder2/ChildFolder3/Hi
 ""

我应该有一个作为根文件夹的 Dir 对象,在其中我应该有一个目录数组,在每个目录上我可以有另一个目录数组,所以一个...

有什么想法吗?感谢您的帮助

【问题讨论】:

  • 你试过用google搜索递归吗? :D
  • 这是一个 MongoDB 问题还是只是一个算法问题“如何将包含路径的字符串列表转换为树结构?”您需要将此树存储在 MongoDB 中还是仅存储在内存中?
  • @Hightechrider 我正在使用 MongoDB,我之所以这么说是因为有人可以帮助我编写更好的文档集合和/或避免 Sql 帮助...
  • @MattDavey 是吗?你能帮我写递归算法吗?

标签: c# .net algorithm mongodb


【解决方案1】:

适用于您的示例数据,但将来可能需要进行一些更新

    static void Main(string[] args)
    {
        var folders = new[] { "Folder1","Folder2","Folder2/ChildFolder","Folder2/ChildFolder2","Folder2/ChildFolder3",
                              "Folder2/ChildFolder3/Folderrrr", "Folder2/ChildFolder3/Hi"
                            };
        var root = new Dir("Root");
        foreach (var folder in folders)
        {
            BuildTree(folder, root);
        }
    }

    private static void BuildTree(string path, Dir parent)
    {
        if (parent == null) return;

        if (path.Contains("/"))
        {
            var dir = path.Substring(0, path.IndexOf("/"));
            var newPath = path.Substring(dir.Length + 1);
            Dir addNodeTo;
            if (!parent.Contains(dir))
            {
                var newParent = new Dir(dir);
                parent.Dirs.Add(newParent);
                addNodeTo = newParent;
            }
            else
            {
                addNodeTo = parent.Get(dir);
            }
            BuildTree(newPath, addNodeTo);
        }
        else
        {
            if (!parent.Contains(path))
                parent.Dirs.Add(new Dir(path));
        }
    }

 public class Dir
 {
    public string Name { get; private set; }
    public string Hash { get; set; }
    public bool Read { get; set; }
    public bool Write { get; set; }
    public List<Dir> Dirs { get; private set; }

    public Dir(string name)
    {
        Name = name;
        Dirs = new List<Dir>();
    }

    public bool Contains(string name)
    {
        return Dirs.Any(d => d.Name.Equals(name));
    }

    public Dir Get(string name)
    {
        return Dirs.FirstOrDefault(d => d.Name.Equals(name));
    }

    public override string ToString()
    {
        return Name;
    }
}

【讨论】:

    【解决方案2】:

    您不需要单独的 Tree 类。因为根本身就是一个目录。所以,只要 Dir 就可以了。

    另外,最好使用列表而不是数组。

    【讨论】:

    • 是的,好吧..我可以将 Tree 转换为一个目录,但是另一个组件需要它。不是我建的。知道如何编写算法吗?
    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多