2

私が行っているプロジェクトでは、ユーザー入力によって指定されたファイルを検索する Java プログラムを作成しました。

コードは、ユーザーが指定したベース ディレクトリ (例: C:) で検索を開始します。このディレクトリ内のすべてのファイルをループして、ファイル名がユーザーが指定した検索用語と一致するかどうかを確認します。一致する場合は、ファイルの絶対パスが文字列に追加されます。ファイルがディレクトリの場合、後で処理するためにリストに追加されます。

ベース フォルダの検索が終了すると、同じ方法でリストの最初のディレクトリを検索/削除し (見つかったディレクトリをもう一度リストに追加します)、検索するディレクトリがなくなるまで続けます。次に、見つかったファイルをユーザーに表示します。

私の質問; ファイルを検索するより良い方法はありますか? ディレクトリをリストに追加するのではなく、すぐにディレクトリを検索するのでしょうか? どんなアドバイスも素晴らしいでしょう、事前に感謝します! これが私のコードです。

public String SearchDir(File directory){
    this.directory = directory;
    do{
        File[] files = this.directory.listFiles();
        if(files != null){
            for(int i = 0; i < files.length; i++){

                // The current file.
                File currentFile = files[i];

                // The files name without extension and path
                // ie C:\Documents and Settings\myfile.file = myfile
                String fileName = this    .removeExtension(this.removePath(currentFile.getName()));


                // Don't search hidden files
                if(currentFile.isHidden()){
                    continue;
                }
                System.out.println(currentFile.getAbsolutePath());

                // Check if the user wanted a narrow search
                if(this.narrow){
                    // Narrow search = check if the file STARTS with the     string given.
                        if(fileName.toLowerCase().startsWith(this.fileName.toLowerCase())){
                    this.found += currentFile.getAbsolutePath() + '\n';
                    this.foundXTimes++;
                }
            }
            else{
                // Non-Narrow search = check for the given string ANYWHERE in the file name.
                if(fileName.toLowerCase().contains(this.fileName.toLowerCase())){
                    this.found += currentFile.getAbsolutePath() + '\n';
                    this.foundXTimes++;
                }
            }

                // If the file is a directory add it to the buffer to be     searched later.
                if(currentFile.isDirectory()){
                    this.directoriesToSearch.add(currentFile);
                }
            }

            if(!this.directoriesToSearch.isEmpty()){
                this.directory = this.directoriesToSearch.remove(0);    
            }
        }
    } while(!this.directoriesToSearch.isEmpty());

    if(!this.found.equals(""))
        return this.found;
    else
        return "x";
}
4

2 に答える 2

6

2 つのアルゴリズムがあります。深さ優先検索と幅優先検索。
http://en.wikipedia.org/wiki/Depth-first_search
http://en.wikipedia.org/wiki/Breadth-first_search

これらのアルゴリズムの時間効率は、質問に対する O(n) です。ベターは不可能です。しかし、二分木を構築することはできます。次に、検索の効率は O(logn) です。ただし、最初に、バイナリ ツリーを構築するための時間を確保する必要があります。1 つだけを検索する場合は、バイナリ ツリーを使用しないでください。

于 2013-05-27T15:14:50.637 に答える