gpt4 book ai didi

java - 递归:检查目录中的文件并读取它们

转载 作者:行者123 更新时间:2023-12-02 05:18:34 25 4
gpt4 key购买 nike

在你推测“这个人正在寻求家庭作业帮助”之类的事情之前,我会先澄清你可能有的任何疑问,并说是的,这与家庭作业有关。然而,我希望这不会影响这个问题为我和/或任何将来阅读本文的人提供的学习。

背景:我们目前正在研究递归,我们的作业要求我们编写一个程序,使用命令参数来检查目录及其文件内容中的字符串(这也是一个命令参数) )。为此我们必须使用递归。

<小时/>

-我想明确表示我理解作业的要求我只是问,这将如何递归地工作,因为我只是不明白。

我们遇到了一个问题,我们必须找到目录的大小,这是有道理的,但我不知道如何检查某个东西是否是目录或文件,并基于此我们读取其内容或深入了解目录,直到找到文件。

<小时/>

这是我目前所做的。不太确定这是多么错误,因为我完全基于我们之前所做的“检查目录大小”分配:

我正在检查的文件夹是这样的:目录 ---> 文件 --主目录内 --->> 两个目录 ----> 这两个目录中的文件

公共(public)类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);
}

}

}

简而言之:如果您想更深入地了解导演,有人可以解释一下递归是如何工作的吗?

最佳答案

我会尝试一下。这是解释起来比理解更容易的事情。

您已经有了一个不错的开始的递归方法可能会记录如下:

“对于给定目录:对于目录中的每个文件,计算包含给定字符串的所有行;对于目录中的每个目录,递归”。

递归是可能的 - 而且很有用 - 因为你的原始目标是一个容器,而它可以包含的事物类型之一是另一个容器。

所以可以考虑这样的计数方法:

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。

人们对递归感到困惑的一件事是,在你写出它之后,它似乎不可能完成它所做的所有事情。但请针对不同的场景考虑上述内容。如果传入的dir有文件而没有dirs,则会为dir中的每个文件累加countedLines,并返回结果。这就是你想要的。

如果该目录确实包含其他目录,那么对于其中的每一个目录,您都将调用例程并从包含的目录开始。该调用将为该目录中的每个文件累积 countedLines ,并在树中递归地为每个目录调用自身,直到到达其中没有目录的目录。它仍然计算其中的行数,只是没有进一步递归。

在最低级别,它将累积这些行并返回它们。然后,第二低的级别将将该总数添加到其总数中,并开始返回递归树。

这样可以更好地解释吗?

关于java - 递归:检查目录中的文件并读取它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26694816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com