最近、BFSとDFSについて知らされ、DFSに何かを実装するように依頼されました。ディレクトリリスト/ファイル名の検索です。私はそれをやってのけることができました(公平に言えば、どのように進めるかについてのヒントを得ました)が、それ以来BFSに興味をそそられ、その概念を同じ問題。
ウィキペディアといくつかのグーグル検索で見つけた図に基づいて、これまでに得た最も近いものは次のとおりです。
コード:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.io.File;
public class foo {
private List<List<String>> queue = new ArrayList<List<String>>();
/**
* @param args
*/
public static void main(String[] args) throws Exception {
foo f = new foo();
f.traverse("src");
f.report();
}
public void traverse(String dir) throws Exception {
// add dir to the top of the tree
queue.add(0, Arrays.asList(dir));
traverse(dir, 1);
}
public void traverse(String dir, int depth) throws Exception {
// add a new depth if this is a new one
if (queue.size() <= depth) {
queue.add(new ArrayList<String>());
}
File file = new File(dir);
for (File curfile: file.listFiles()) {
queue.get(depth).add(curfile.getPath());
// recursive function call if curfile is a directory
if (curfile.isDirectory()) traverse(curfile.getPath(), depth+1);
}
}
public void report() {
for (int i=0; i<queue.size()-1; i++) {
log(String.format("****** Level %d ******", i));
for (String node : queue.get(i))
log(String.format("[%d] `%s'", i, node));
}
}
public void log(String s) {
System.out.printf("[foo] %s\n", s);
}
}
出力:
[foo] ****** Level 0 ******
[foo] [0] 'src'
[foo] ****** Level 1 ******
[foo] [1] 'src/A'
[foo] [1] 'src/C'
[foo] [1] 'src/foo.java'
[foo] [1] 'src/B'
[foo] ****** Level 2 ******
[foo] [2] 'src/A/A2'
[foo] [2] 'src/A/A1'
[foo] [2] 'src/C/C1'
[foo] ****** Level 3 ******
[foo] [3] 'src/A/A2/A2A'
[foo] [3] 'src/A/A1/A1A'
[foo] [3] 'src/C/C1/C1A'
[foo] [3] 'src/C/C1/C1B'
[foo] ****** Level 4 ******
[foo] [4] 'src/A/A2/A2A/A2A1'
[foo] [4] 'src/C/C1/C1A/C1A1'
[foo] ****** Level 5 ******
[foo] [5] 'src/A/A2/A2A/A2A1/A2A1A'
[foo] ****** Level 6 ******
[foo] [6] 'src/A/A2/A2A/A2A1/A2A1A/A2A1A1'
[foo] [6] 'src/A/A2/A2A/A2A1/A2A1A/A2A1A2'
正しく見える出力を吐き出しますが、内部の仕組みが間違っていることを知っているので、これは正しくないことを私は知っています。これは本質的に、証拠を隠すためにArrayListを使用して、BFSを装ったDFSです。
この概念を理解しようと先延ばしを始めてから約1か月間、机に穴を開けるフレームワークの本を持っているので、誰かがここで閉鎖するのを手伝ってくれることを切に願っています。それで、たくさんのとりとめのないものに埋もれて、私の質問は、BFSをディレクトリ構造にどのように適用できるかということです。また、BFS / DFS実装例の「For-Dummies」バージョンはオンラインまたは印刷物でどこかにありますか?