使用根目录创建树视图

时间:2012-07-28 20:09:57

标签: c# algorithm

我一直在寻找解决一个简单问题的方法,并找到了这种递归解决方案:https://stackoverflow.com/a/674119/536607

哪个好,但它假设您有一个固定的起始根,然后在其下构建其余的文件结构。

我正在尝试提出一种基本相同的算法,除非没有第一个硬编码的根。例如,我有以下文件

Data/test.txt
Data/dir/results.txt
Another/image.jpg
file.dat

会导致以下树

Data
   test.txt
   dir
      results.txt
Another
   image.txt
file.dat

所以它几乎就像其他解决方案一样,除了我删除顶部根然后再推回一切。但我想你不能轻易做到这一点(可以吗?那么会非常方便)

这是我想到的算法

  • 首先,照常拆分路径
  • 定义一个新方法,该方法将检查树视图是否包含一个密钥等于路径第一部分的节点(因为我们以目录为根)
  • 如果存在,则返回该节点。否则,创建节点并将其返回
  • 现在将节点和其余路径部分传递给另一个方法,该方法将步骤3中找到的节点视为根并从那里开始。

听起来应该有用。关于第二步还不太清楚,因为如果文件存储在任何地方,该怎么办?

1 个答案:

答案 0 :(得分:0)

写出所描述的算法。似乎按预期工作。不太确定路径中没有目录的文件。

有人看到了问题吗?

// start by getting the root
private void build_file_list(List<Entry> entries)
{
    TreeNode root;
    string[] pathbits;
    for (int i = 0; i < entries.Count(); i++)
    {
        pathbits = entries[i].name.Split(Path.DirectorySeparatorChar);
        root = get_root(pathbits[0]);
        add_path(root, pathbits);
    }
}

// returns existing node or creates a new one as needed
private TreeNode get_root(string key)
{
    if (explorer_view.Nodes.ContainsKey(key))
        return explorer_view.Nodes[key];
    else
        return explorer_view.Nodes.Add(key, key);
}

// now we have our root so we can start building the rest
private void add_path(TreeNode node, string[] pathbits)
{
    for (int i = 1; i < pathbits.Count(); i++)
        node = add_node(node, pathbits[i]);
}



// just recursively build nodes until end of file path
private TreeNode add_node(TreeNode node, string key)
{
    if (node.Nodes.ContainsKey(key))
        return node.Nodes[key];
    else
        return node.Nodes.Add(key, key);
}