public class TreeNode<T> implements Iterable<TreeNode<T>> {
public T data;
public TreeNode<T> parent;
public List<TreeNode<T>> children;
public boolean isRoot() {
return parent == null;
}
private List<TreeNode<T>> elementsIndex;
public TreeNode(T data) {
this.data = data;
this.children = new LinkedList<TreeNode<T>>();
this.elementsIndex = new LinkedList<TreeNode<T>>();
this.elementsIndex.add(this);
}
public TreeNode<T> addChild(T child) {
TreeNode<T> childNode = new TreeNode<T>(child);
childNode.parent = this;
this.children.add(childNode);
this.registerChildForSearch(childNode);
return childNode;
}
private void registerChildForSearch(TreeNode<T> node) {
elementsIndex.add(node);
if (parent != null)
parent.registerChildForSearch(node);
}
@Override
public String toString() {
return data != null ? data.toString() : "[data null]";
}
@Override
public Iterator<TreeNode<T>> iterator() {
TreeNode<T> iter = new TreeNode<T>((T) this);
return (Iterator<TreeNode<T>>) iter;
}
public static TreeNode<File> createDirTree(File folder) {
if (!folder.isDirectory()) {
throw new IllegalArgumentException("folder is not a Directory");
}
TreeNode<File> DirRoot = new TreeNode<File>(folder);
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
appendDirTree(file, DirRoot);
} else {
appendFile(file, DirRoot);
}}
return DirRoot;
}
public static void appendDirTree(File folder, TreeNode<File> DirRoot) {
DirRoot.addChild(folder);
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
appendDirTree(file, DirRoot.children.get(DirRoot.children.size() - 1));
} else {
appendFile(file, DirRoot.children.get(DirRoot.children.size() - 1));
}} }
public static void appendFile(File file, TreeNode<File> filenode) {
filenode.addChild(file);
}
问题是,在这种代码状态下,文件和目录是这样打印的:
rootFolder
├─ Folder1
│ ├─ subFolder1
│ │ ├─ a.txt
│ │ ├─ b.txt
│ │ ├─ c.txt
│ │ └─ d.txt
│ ├─ subFolder2
│ │ ├─ a.txt
│ │ ├─ B.txt
│ │ ├─ c.txt
│ │ └─ D.txt
│ ├─ subFolder3
│ │ ├─ A.txt
│ │ ├─ b.txt
│ │ ├─ C.txt
│ │ └─ d.txt
│ └─ subFolder4
│ ├─ a.txt
│ ├─ b.txt
│ ├─ c.txt
│ └─ d.txt
├─ File1.txt
├─ Folder2
│ ├─ a.txt
│ ├─ b.txt
│ ├─ c.txt
│ └─ d.txt
└─ File2.txt
但是我需要先打开目录,然后打开文件:file1.txt
靠近file2.txt
。我试图找出问题出在哪里,但无济于事。我需要改变什么,在代码中的哪里得到想要的结果?
问题是追加子树的顺序。
正如Java文档对.listfiles()
所说:
不能保证结果数组中的名称字符串将以任何特定顺序出现;它们尤其不能保证按字母顺序出现。
public static TreeNode<File> createDirTree(File folder) {
if (!folder.isDirectory()) {
throw new IllegalArgumentException("folder is not a Directory");
}
List<File> children = Arrays.asList(folder.listFiles());
children.sort(Comparator.comparing(file -> file.isDirectory() ? -1 : 1));
TreeNode<File> DirRoot = new TreeNode<File>(folder);
for (File file : children) {
if (file.isDirectory()) {
appendDirTree(file, DirRoot);
} else {
appendFile(file, DirRoot);
}}
return DirRoot;
}
public static void appendDirTree(File folder, TreeNode<File> dirRoot) {
dirRoot.addChild(folder);
List<File> children = Arrays.asList(folder.listFiles());
children.sort(Comparator.comparing(file -> file.isDirectory() ? -1 : 1));
for (File file : children) {
if (file.isDirectory()) {
appendDirTree(file, dirRoot.children.get(dirRoot.children.size() - 1));
} else {
appendFile(file, dirRoot.children.get(dirRoot.children.size() - 1));
}
}
}
public static TreeNode<File> createDirTree(File folder) {
if (!folder.isDirectory()) {
throw new IllegalArgumentException("folder is not a Directory");
}
TreeNode<File> DirRoot = new TreeNode<File>(folder);
Arrays.stream(folder.listFiles())
.sorted(Comparator.comparing(f -> (f.isDirectory() ? 1 : -1)))
.forEach(file -> {
if (file.isDirectory()) {
appendDirTree(file, DirRoot);
} else {
appendFile(file, DirRoot);
}
});
return DirRoot;
}
我必须打印一个目录树(像树命令),示例: 我尝试使用以下代码: 我试了几个版本,但还是不行。这怎么做?如果是什么条件?我知道很简单,但我做不到。
问题内容: 我有一个JSON文件,我想把它打印成一团糟。在Python中最简单的方法是什么? 我知道PrettyPrint带有一个“对象”,我认为它可以是一个文件,但是我不知道如何传递文件。仅使用文件名是行不通的。 问题答案: 该模块已经实现了一些基本的漂亮打印,其参数指定缩进多少空格: 要解析文件,请使用:
问题内容: 我有一个JSON文件,我想把它弄得一团糟-在python中最简单的方法是什么?我知道PrettyPrint带有一个“对象”,我认为它可以是一个文件,但是我不知道如何传递文件-仅使用文件名不起作用。 问题答案: 该模块已经使用参数实现了一些基本的漂亮打印: 要解析文件,请使用json.load():
我想把我正在编辑的文件发送到打印机,就像我在记事本中做的那样。我没有发现任何关于打印命令的提示。这是不可能的吗?
我目前的工作是创建机械图纸,用于发送给客户和作为施工图。当我的绘图完成后,我导出一个. pdf文件,并将其发送给客户端。 我们的客户非常喜欢黑白画,所以我试着提供他们。但是我用来画画的软件效果不好。它只有一个选项“所有颜色都是黑色”,我的画上有一些白色的“隐藏线”。当然,这些显示使用所有颜色作为黑色选项。 我找到了一个解决方案,那就是使用pdf打印机。效果很好,效果也很好。 现在我想打印这个。pd
问题内容: 搜索过,但没有找到满意的答案。 我知道没有可移植的方式来打印pthread_t。 您如何在您的应用程序中做到这一点? 更新: 实际上,我不需要pthread_t,但是需要一些小的数字ID,以便在调试消息中标识不同的线程。 在我的系统(64位RHEL 5.3)上,它被定义为unsigned long int,因此它的数量很大,仅打印它就在调试行中占据了宝贵的位置。 gdb 如何 分配 短