1

私は再帰の基本を知っていますが、与えられたコードではフローを理解するのが困難に直面しています。
助けてください...

public ArrayList<String> searchFolders(File fo) {

    if (fo.isDirectory()) {

        String internalNames[] = fo.list();



        for (int i = 0; i < internalNames.length; i++) {
            searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i]));
            path = fo.getAbsolutePath() + "\\" + internalNames[i];
        }
    }
    if (fo.isFile()) {

        alist.add(fo.toString());


    }


    return alist;
}
4

3 に答える 3

2

基本的に、このコードはディレクトリのすべてのコンテンツを取得し、それらをグローバル変数に追加しますalist

あなたはそれにディレクトリを与えます。ファイルの場合は、その名前がリストに追加され、メソッドが返されます(ファイルにサブフォルダーを含めることはできません)。

フォルダの場合は、フォルダ内のすべてのものが一覧表示されます。

String internalNames[] = fo.list();

次に、フォルダ内の各アイテムに対して同じ検索を実行します。

searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i]));

したがって、現在検索しているアイテムがファイル(ファイルfo.getAbsolutePath() + "\\"+ internalNames[i]のディレクトリの場合)の場合は、ファイルをグローバルArrayListに追加するだけです。

それ以外の場合は、フォルダの場合は、見ているフォルダを検索したときと同じように検索し、フォルダ内のすべてのファイルを一覧表示します。

変数を使用していないようですpath

を返すalistと、これまでにフォルダー(およびそのサブフォルダー)で見つかったすべてのファイルが返されます。fo.isDirectory()に名前を追加していないため、フォルダ名は返されませんalist

ここに画像の説明を入力してください

于 2012-06-20T09:13:22.070 に答える
1

この再帰コードをツリーエクスプローラーと考えてください。searchFoldersメソッドは、現在のディレクトリに存在するすべてのファイル/フォルダーをスキャンしてリストを作成するため、ルートノードからすべての子を取得していると言えます。

リストを取得した後、ルートノードの各子で自分自身を呼び出し(フォルダーとファイルを再度検索するため)、検索先を知るためにパスを更新します。

探索するフォルダーがなく、ファイルのみを持つすべての子ノード(nレベルまで下がっていても)が見つかると停止します。

于 2012-06-20T09:12:39.013 に答える
0

簡単に言うと、再帰出口を検討してください。

if (fo.isFile()) {

    alist.add(fo.toString());


}

がファイルの場合fo、ファイルパスを追加しalistて終了します。この再帰終了条件に当てはまらない場合、foはディレクトリであり、再帰終了まで繰り返します---'fo'はファイルです。

したがって、このsearchFoldersメソッドはフォルダとサブフォルダ内のすべてのファイルを検索し、それらの名前をリストとして返します。

于 2012-06-20T09:43:22.810 に答える