0

私は単純な問題を解決する方法を探していて、この再帰的な解決策を見つけました: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で見つかったノードをルートとして扱い、そこから移動します。

どちらがうまくいくように聞こえますか。ファイルが保存されている場所にルート化されている場合はどうなるので、2番目のステップについてあまり明確ではありませんか?

4

1 に答える 1

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);
}
于 2012-07-28T20:48:32.507 に答える