我正在尝试从单行字符串
重新排列字符串的内容(文件).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
答案 0 :(得分:0)
您没有使用getFileStructure的返回值:
ret + = getFileStructure(...)
答案 1 :(得分:0)
编辑:
我原来的回答是完全错误的。
经过进一步考虑后,我不认为递归在这种情况下是个好主意。 为了使递归起作用,每当遇到文件夹启动时,必须找到匹配的文件夹结束,然后以文件夹的内容作为输入递归调用该函数。 但是,为了找到哪个(〜文件夹)标记当前文件夹的结尾,您必须扫描该文件夹的所有内容。在执行此操作时,您已经可以为文件夹的竞争构造输出,因此递归调用没有意义。
例如,假设您有结构(文件夹)A(文件)a(〜文件)(文件夹)B(文件)b(〜文件)(〜文件夹)(文件夹)C(〜文件夹) (〜文件夹)强>(文件夹)d(〜文件夹)。我用粗体字标记了文件夹A的结尾。为了找到它你必须保持一个柜台。每次找到(文件夹)字符串时,都会增加计数器,并且每次找到(〜文件夹)字符串以减少它。只有当计数器返回到启动文件夹A之前的值时,您才到达该文件夹的末尾。在浏览字符串时,您可以打印文件夹A的所有内容,使用计数器确定缩进所需的标签数量。