2

我正在尝试从单行字符串重新排列字符串的内容

(file).DS_Store(~file)(folder)server(file).DS_Store(~file)(folder)test1(~folder)(folder)test2(~folder)(folder)test3(file).DS_Store(~file )(文件夹)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 的结尾。为了找到它,您必须维护一个计数器。每次找到(文件夹)字符串时,您都会增加计数器,每次找到(〜文件夹)字符串时都会减少它。只有当计数器恢复到启动文件夹 A 之前的值时,您才到达该文件夹的末尾。在遍历字符串时,您可以打印文件夹 A 的所有内容,使用计数器来决定缩进需要多少个制表符。

于 2013-02-15T23:40:27.670 回答