import java.nio.file.*;
import java.util.*;
import java.io.File;
import static java.
lang.
System.
out;
class Main {
public static void main
(String[] args
) { Database d = new Database();
d.add("/usr/bin");
d.add("/usr");
d.add("/dev");
d.add("/dev/sda1");
d.add("/dev/sda2");
d.add("/home/user/Desktop/file.txt");
d.add("/home/user/Documents/file2.txt");
d.add("/home/user/Documents/file3.txt");
out.println("Final path list (using Unix paths):");
out.println(d.getPathsList());
d = new Database();
d.add("C:\\usr\\bin");
d.add("C:\\usr");
d.add("C:\\dev");
d.add("C:\\dev\\sda1");
d.add("C:\\dev\\sda2");
d.add("C:\\home\\user\\Desktop\\file.txt");
d.add("C:\\home\\user\\Documents\\file2.txt");
d.add("C:\\home\\user\\Documents\\file3.txt");
out.println("\nFinal path list (using Windows paths):");
out.println(d.getPathsList());
}
}
class Database {
root.
add(Arrays.
asList(p.
split("\\\\|/")),
0); }
public void addAll(Collection<? extends String> list) {
add(p);
}
public List<String> getPathsList() {
ArrayList<String> list = new ArrayList<>();
root.listPaths(list, "");
return list;
}
PathNode root = new PathNode("");
static class PathNode {
public Map
<String, PathNode
> children
= new HashMap
<>();
public PathNode
(String name
) { this.name = name;
}
public boolean isLeaf() {
return children.size()==0;
}
public boolean isRoot() {
return name.isEmpty();
}
public void add(List<String> path, int i) {
String childName
= path.
get(i
); PathNode child = children.get(childName);
if (child != null) {
if (path.size()-i <= 1) child.children.clear();
else child.add(path, i+1);
} else if (!isLeaf() || isRoot()) {
PathNode node = this;
for (; i < path.size(); i++) {
node.children.put(key, node = new PathNode(key));
}
}
}
public void listPaths
(ArrayList
<String
> list,
String prefix
) { for (PathNode child : children.values()) {
if (child.isLeaf()) list.add(prefix+child.name);
else child.
listPaths(list, prefix
+child.
name+File.
separator); }
}
}
}