2

の単一行文字列から文字列の内容を再配置しようとしています

(ファイル).DS_Store(~ファイル)(フォルダ)サーバー(ファイル).DS_Store(~ファイル)(フォルダ)test1(~フォルダ)(フォルダ)test2(~フォルダ)(フォルダ)test3(ファイル).DS_Store(~ファイル) )(フォルダ)test4(ファイル).DS_Store(~ファイル)(フォルダ)test5(ファイル).DS_Store(~ファイル)(ファイル)item.txt(~ファイル)(~フォルダ)(~フォルダ)(~フォルダ)( ~フォルダ)(ファイル)text.txt(~ファイル)

のような複数行の文字列に

(file).DS_Store(~file)
(folder)client
    (folder)test6(~folder)
    (folder)test7
        (folder)test9
            (folder)test10
                (file)itemClient(~file)
            (~folder)
        (~folder)
    (~folder)
    (folder)test8(~folder)
(~folder)
(file)test.txt(~file)
(file)text.txt(~file)

再帰が役立つことはわかっていますが、再帰関数を記述しようとすると、最初の区切り記号のみがチェックされて停止し、残りの文字列はチェックされません。これは私が使用しているコードです。

public String getFileStructure(String list, int level){
    String str = list;
    String ret = "";
    String fileStart = "(file)";
    String fileEnd = "(~file)";
    String folderStart = "(folder)";
    String folderEnd = "(~folder)";

    if (!list.isEmpty()) {
         for (int i = 0; i < level; i++) {
                ret+="\t";
            }
            if (str.startsWith(folderStart)) {
                ret+= "[" + str.substring(str.indexOf(folderStart)+8, str.indexOf(folderEnd)) + "]\n";
                getFileStructure(str, level + 1);
            } else {
                ret+= str.substring(str.indexOf(fileStart)+6, str.indexOf(fileEnd));
            }
    }
    return ret;
} 

しかし、それはちょうど戻ります

.DS_Store
.DS_Store
4

2 に答える 2

0

getFileStructureからの戻り値を使用していません。

ret + = getFileStructure(...)

于 2013-02-15T23:35:11.260 に答える
0

編集 :

私の最初の答えは完全に間違っていました。

さらに検討した結果、この場合、再帰は良い考えではないと思います。再帰を機能させるには、フォルダーの開始点に遭遇するたびに、一致するフォルダーの終了点を見つけてから、フォルダーの内容を入力として関数を再帰的に呼び出す必要があります。ただし、どの (~folder) が現在のフォルダーの終わりを示しているかを見つけるには、フォルダーのすべてのコンテンツをスキャンする必要があります。それを行っている間、フォルダーの競合の出力を既に作成できるため、再帰呼び出しの意味はありません。

たとえば、構造 (folder)A(file)a(~file)(folder)B(file)b(~file)(~folder)(folder)C(~folder) (~folder) ( folder) があるとします。 )D(~フォルダ)。フォルダー A の末尾を太字でマークしました。それを見つけるには、カウンターを維持する必要があります。(folder) 文字列を見つけるたびにカウンターを増やし、(~folder) 文字列を見つけるたびにそれを減らします。カウンターがフォルダー A を開始する前の値に戻った場合にのみ、そのフォルダーの最後に到達したことになります。文字列を調べながら、カウンターを使用してインデントに必要なタブの数を決定し、フォルダー A のすべてのコンテンツを印刷できます。

于 2013-02-15T23:40:27.670 に答える