You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package class50;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
public class Problem_0588_DesignInMemoryFileSystem {
class FileSystem {
public class Node {
// 文件名、目录名
public String name;
// content == null 意味着这个节点是目录
// content != null 意味着这个节点是文件
public StringBuilder content;
public TreeMap<String, Node> nexts;
// 构造目录
public Node(String n) {
name = n;
content = null;
nexts = new TreeMap<>();
}
// 构造文件c是文件内容
public Node(String n, String c) {
name = n;
content = new StringBuilder(c);
nexts = new TreeMap<>();
}
}
public Node head;
public FileSystem() {
head = new Node("");
}
public List<String> ls(String path) {
List<String> ans = new ArrayList<>();
Node cur = head;
String[] parts = path.split("/");
int n = parts.length;
for (int i = 1; i < n; i++) {
if (!cur.nexts.containsKey(parts[i])) {
return ans;
}
cur = cur.nexts.get(parts[i]);
}
// cur结束了来到path最后的节点该返回了
// ls a/b/c cur 来到c目录
// 如果c是目录那么就要返回c下面所有的东西
// 如果c是文件那么就值返回c
if (cur.content == null) {
ans.addAll(cur.nexts.keySet());
} else {
ans.add(cur.name);
}
return ans;
}
public void mkdir(String path) {
Node cur = head;
String[] parts = path.split("/");
int n = parts.length;
for (int i = 1; i < n; i++) {
if (!cur.nexts.containsKey(parts[i])) {
cur.nexts.put(parts[i], new Node(parts[i]));
}
cur = cur.nexts.get(parts[i]);
}
}
public void addContentToFile(String path, String content) {
Node cur = head;
String[] parts = path.split("/");
int n = parts.length;
for (int i = 1; i < n - 1; i++) {
if (!cur.nexts.containsKey(parts[i])) {
cur.nexts.put(parts[i], new Node(parts[i]));
}
cur = cur.nexts.get(parts[i]);
}
// 来到的是倒数第二的节点了注意for
if (!cur.nexts.containsKey(parts[n - 1])) {
cur.nexts.put(parts[n - 1], new Node(parts[n - 1], ""));
}
cur.nexts.get(parts[n - 1]).content.append(content);
}
public String readContentFromFile(String path) {
Node cur = head;
String[] parts = path.split("/");
int n = parts.length;
for (int i = 1; i < n; i++) {
if (!cur.nexts.containsKey(parts[i])) {
cur.nexts.put(parts[i], new Node(parts[i]));
}
cur = cur.nexts.get(parts[i]);
}
return cur.content.toString();
}
}
}