我有一个堆栈,我正在尝试添加一个目录(一个包含两(2)个子.txt文件的目录 - 暂时保持简单):
public static int fileCount(File directory)
{
Stack<File> fileStack = new Stack<File>();
fileStack.push(directory);
}
显然,这部分很简单;然而,以下部分是我被困的地方。我知道 - 至少在理论上 - 是如何遍历该目录以便我能够“弄清楚”其中有多少文件(换句话说,就是为了达到它的孩子)。这是我的尝试,到目前为止(和Stacks看起来很简单,所以我必须遗漏一些东西,更大):
// Same method, with the meaningful "guts" added:
public static int fileCount(File directory)
{
Stack<File> fileStack = new Stack<File>();
filestack.push(directory);
int totalFiles = 0;
while(!fileStack.isEmpty()
{
try
{
File poppedElement = (File)fileStack.pop(); // Here's where I think my problem is
if (poppedElement.isFile())
{
totalSize++;
}
else
{
fileStack.push(fileStack.peek());
}
}
catch(EmptyStackException emptyStackException)
{
emptyStackException.printStackTrace();
}
}
return totalFiles;
}
我认为我的问题的第一部分是我.pop()
之前发生任何事情的元素(这也意味着返回EmptyStackException)。在这个时刻的任何指导表示赞赏。
所描述的解决方案here似乎是解决问题的方法(虽然我的解决方案不是递归的),但感觉方式相同(尽管使用不同的语言)。显然,这是一个广度优先搜索(BFS) - 一篇关于可以找到的文章,here。我遇到的麻烦是实现一个能够获得弹出的顶级元素的子句的解决方案。
答案 0 :(得分:0)
以下是public static
方法,因此是一个代码片段。该代码与初始问题中的代码有三种不同的方式:
首次调用该方法时,会实例化File
个对象的数组,并将其初始化为指定路径的内容(File
个对象)(此处为目录或文件夹)。
该方法遍历数组File[] potentialDirectories
中的每个文件元素,将每个元素推送到StackFile> fileStack
,而不管其“文件夹”或“文件”状态如何。 目录未被推送,目录的内容被推送。
在while(condition)
循环中,else
正文发生了很大变化。如果元素不是文件,即文件夹,则else条件为true
。如果元素是文件夹,则重新初始化potentialDirectories
以包含该文件夹的内容 - 元素 - potentialDirectories = poppedElement.listFiles()
,并且每个元素再次被推送到堆栈。
第三个区别可能是最重要的,因为这是通过首先获得它们并将第二个推送到堆栈中来实现检查 - 迭代结束 - 子元素的区别。如果元素不是文件,我们知道它可以包含其他File
个对象,因此可以listFile()
访问每个子元素的非文件(文件夹)元素。
public static int fileCount(File directory) throws NullPointerException
{
Stack<File> fileStack = new Stack<File>();
File[] potentialDirectories = directory.listFiles();
for (File file: potentialDirectories)
{
fileStack.push(file);
}
int totalSize = 0;
while (!fileStack.isEmpty())
{
File poppedElement = (File)fileStack.pop();
if(poppedElement.isFile())
{
totalSize++;
}
else
{
potentialDirectories = poppedElement.listFiles();
for (File file: potentialDirectories)
{
fileStack.push(file);
}
}
}
return totalSize;
}