在你推测像“这家伙正在寻求家庭作业帮助”之类的事情之前,我会继续说清楚你可能有的任何疑问并说是,这与家庭作业有关。但是,我希望这不会影响这个问题为我和/或将来读这个问题的人提供的知识。
背景:我们正在进行递归,我们的任务要求我们编写一个程序,使用命令参数检查目录及其文件内容以查找字符串(这也是一个命令参数)。我们必须使用递归。
- 我想明确表示我了解分配的要求 我只是在问,这是如何递归的,因为我没有得到它。
我们遇到了一个问题,我们必须找到一个目录的大小,这是有意义的,但我不知道如何检查某些东西是一个目录或文件,并基于我们阅读其内容或深入了解直到找到文件为止的目录。
这是我目前所做的。不太确定这是多么错误,因为我完全基于我们以前做过的'检查目录大小'的分配:
我正在检查的文件夹是这样的: 目录---> files --inside主目录--->>两个目录---->这两个目录中的文件
public class SearchingForStrings {
public static void main(String[] args) {
String path = "."; // default location of this project
File sf = new File(path);
String mysteriesDirectory = args[0];
String keyString = args[1];
countLinesWithString(sf, mysteriesDirectory, keyString);
}
public static int countLinesWithString(File startPath, String mysteriesDirectory, String keyString) {
if(!startPath.exists()) {
throw new IllegalArgumentException("File " + startPath + " does not exist!");
} else if(startPath.isFile()) {
return Integer.parseInt(startPath.getAbsolutePath()); // Just to show where the file is I located the parsing is just to stop an error from flagging on this part; Going to ask professor if it's okay with him
// this is where we would begin reading the contents of the files
} else if(startPath.isDirectory()) {
// This is where our recursion would take place: essentially
// we will be going 'deeper' into the directory until we find a file
//File[] subFiles = startPath.listFiles();
countLinesWithString(startPath, mysteriesDirectory, keyString);
} else {
throw new IllegalStateException("Unknown file type: " + startPath);
}
}
}
简而言之:如果你想深入了解导演(y / ies),有人可以解释递归是如何起作用的吗?
答案 0 :(得分:1)
我会试一试。这比理解更容易解释。
你已经取得了不错的开始的递归方法可能记录如下:
“对于给定目录:对于目录中的每个文件,计算包含给定字符串的所有行;对于目录中的每个目录,递归”。
递归是可能的 - 也是有用的 - 因为你的原始目标是一个容器,它可以包含的其中一种类型是另一个容器。
所以想想这样的计数方法:
int countLines(dir, string) // the string could be an instance variable, also, and not passed in
{
var countedLines = 0;
for each item in dir:
if item is file, countedLines += matchedLinesInFile(item, string);
else if item is dir, countedLines += countLines(item, string);
else throw up; // or throw an exception -- your choice
}
然后从外部方法调用countLines,使用原始目录,加上字符串。
让人们了解递归的一个原因是,在你写完之后,它似乎不可能完成它所做的一切。但通过以上针对不同场景进行思考。如果传入的目录有文件而没有dirs,它将为dir中的每个文件累积countLines,并返回结果。这就是你想要的。
如果dir确实包含其他目录,那么对于其中每一个,你将调用例程并从包含dir开始。该调用将为该目录中的每个文件累积countLines,并在树中递归调用每个目录,直到它到达没有dirs的目录。而且它仍然会计算那些线条,它只是没有任何进一步下降。
在最低级别,它将累积这些线并返回它们。然后第二个最低级别将获得该总数添加到其总数,并开始返回行程返回递归树。
这能解释得更好吗?
答案 1 :(得分:1)
帮助您开始递归检查: 它将递归地从基本目录打印所有文件夹和文件。 根据您的要求进行修改。试着告诉我们。
import java.io.File;
public class Test {
public static void getResource(final String resourcePath) {
File file = new File(resourcePath);
if (file.isFile()) {
System.out.println("File Name : " + file.getName());
return;
} else {
File[] listFiles = file.listFiles();
if (listFiles != null) {
for (File resourceInDirectory : listFiles) {
if (!resourceInDirectory.isFile()) {
System.out.println("Folder "
+ resourceInDirectory.getAbsolutePath());
getResource(resourceInDirectory.getAbsolutePath());
} else {
getResource(resourceInDirectory.getAbsolutePath());
}
}
}
}
}
public static void main(String[] args) {
final String folderPath = "C:/Test";
getResource(folderPath);
}
}