我如何在java中递归重新排列字符串

时间:2013-02-15 23:30:05

标签: java string recursion

我正在尝试从单行字符串

重新排列字符串的内容
  

(文件).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

2 个答案:

答案 0 :(得分:0)

您没有使用getFileStructure的返回值:

ret + = getFileStructure(...)

答案 1 :(得分:0)

编辑:

我原来的回答是完全错误的。

经过进一步考虑后,我不认为递归在这种情况下是个好主意。 为了使递归起作用,每当遇到文件夹启动时,必须找到匹配的文件夹结束,然后以文件夹的内容作为输入递归调用该函数。 但是,为了找到哪个(〜文件夹)标记当前文件夹的结尾,您必须扫描该文件夹的所有内容。在执行此操作时,您已经可以为文件夹的竞争构造输出,因此递归调用没有意义。

例如,假设您有结构(文件夹)A(文件)a(〜文件)(文件夹)B(文件)b(〜文件)(〜文件夹)(文件夹)C(〜文件夹) (〜文件夹)(文件夹)d(〜文件夹)。我用粗体字标记了文件夹A的结尾。为了找到它你必须保持一个柜台。每次找到(文件夹)字符串时,都会增加计数器,并且每次找到(〜文件夹)字符串以减少它。只有当计数器返回到启动文件夹A之前的值时,您才到达该文件夹的末尾。在浏览字符串时,您可以打印文件夹A的所有内容,使用计数器确定缩进所需的标签数量。