gpt4 book ai didi

java - 解析Java中的目录结构

转载 作者:搜寻专家 更新时间:2023-10-31 20:20:27 27 4
gpt4 key购买 nike

我必须解析以下文本文件中给出的一组目录:

# Note: The root folder's parent is labelled as "?"
# Assume all directory has different name
#
A,?
B,A
C,A
D,C
E,C
F,C
G,F

上面的文件,是这样描述目录结构的:

A
|
+ B
|
+ C
| |
| + D
| |
| + E
| |
| + F
| | |
| | + G

假设以#开头的行是注释,我现在有以下代码:

String line;
BufferedReader f = new BufferedReader(new FileReader(new File("directory.txt")));
while ((line = f.readLine()) != null)
{
if (!line.substring(0, 1).equals("#"))
{
String directory, parent;
directory = line.split(",")[0];
parent = line.split(",")[1];
if (parent.equals("?"))
System.out.println("Directory " + directory + " is the root.");
else
System.out.println("Directory " + directory + " found inside " + parent + ".");
}
}

所以,这只是显示目录的工作,也不是以分层方式来解析它们。它只是给出文本表示的输出,这样:

Directory A is the root.
Directory B found inside A.
Directory C found inside A.
Directory D found inside C.
Directory E found inside C.
Directory F found inside C.
Directory G found inside F.

如果它是 PHP,我可以将它转换为 JSON 节点并可以以分层方式解析父节点或同级节点,但我不确定我应该如何在 Java 中实现这一点。任何提示对我来说都很棒。

现在,我以这种方式为树结构创建了一个类:

public class Directory {
private String name;
private Directory parent;
}

但我不确定如何在主 Java 程序中将目录链接为一种链表。这里的任何帮助将不胜感激。所以,当我在这里做某种树结构时,我想实现类似目录遍历程序的东西。

比如说,如果我将输入作为 DirectoryParser C,那么它应该输出如下内容:

C
|
+ D
|
+ E
|
+ F
| |
| + G

我目前的方法是否可行?有人可以指导我如何实现这一目标吗?提前致谢。

Disclaimer: I went through Java tree data-structure?, but I am supposed to get something simple in a single file without using any external plugins. :(

最佳答案

假设所有引用的父目录都是已经在前面几行中列出的目录,您可以一次创建目录树。将您创建的每个目录放在 map 中。然后,一旦您创建了一个新目录,就会在该映射中搜索父目录。

所以将每一行输入到这样的内容中:

public void parseLine(String line) {
if (isComment.matcher(line).matches()) {
return; // comment, skip line
}

Matcher m = dirPattern.matcher(line);
if (!m.matches()) {
throw new InvalidSyntaxException("line " + line + " does not follow dir syntax.");
}

String dirName = m.group(0);
String parentDirName = m.group(1);
if (parentDirName == "?") {
directories.put(dirName, new Directory(dirName));
} else {
Directory parentDir = directories.get(parentDirName);
if (parentDir == null) {
throw new DirectoryNotFoundException("Directory " + parentDir + " not found");
}
directories.put(dirName, new Directory(dirName, parentDir));
}
}

目录是:

public class Directory {
private String name;
private Directory parent;
private Set<Directory> children = new HashSet<Directory>();

public Directory(String n) {
this(n, null);
}

public Directory(String n, Directory p) {
name = n;
parent = p;
if (parent != null) {
parent.addChild(this);
}
}

// keep private to ensure no child is set without a proper parent
private void addChild(Directory child) {
children.add(child);
}

@Override
public String toString() {
String str = name;
for (Directory child : children) {
str += child.toString();
}
return str;
}
.... be sure to implement equals and hashCode ...
}

注意事项:

  • 如果没有上述顺序,您可以在两次通过中实现相同的目标。一次获取所有目录,第二次设置所有父级。
  • 这假定一个\w+,\w+ 格式和唯一的目录名
  • 你可以使用 toString 来生成你的树

关于java - 解析Java中的目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22173685/

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