fork(2) download
  1. import java.nio.file.*;
  2. import java.util.*;
  3. import java.io.File;
  4.  
  5. import static java.lang.System.out;
  6.  
  7. class Main {
  8.  
  9. public static void main(String[] args) {
  10. Database d = new Database();
  11.  
  12. d.add("/usr/bin");
  13. d.add("/usr");
  14. d.add("/dev");
  15. d.add("/dev/sda1");
  16. d.add("/dev/sda2");
  17. d.add("/home/user/Desktop/file.txt");
  18. d.add("/home/user/Documents/file2.txt");
  19. d.add("/home/user/Documents/file3.txt");
  20.  
  21. out.println("Final path list (using Unix paths):");
  22. out.println(d.getPathsList());
  23.  
  24. d = new Database();
  25.  
  26. d.add("C:\\usr\\bin");
  27. d.add("C:\\usr");
  28. d.add("C:\\dev");
  29. d.add("C:\\dev\\sda1");
  30. d.add("C:\\dev\\sda2");
  31. d.add("C:\\home\\user\\Desktop\\file.txt");
  32. d.add("C:\\home\\user\\Documents\\file2.txt");
  33. d.add("C:\\home\\user\\Documents\\file3.txt");
  34.  
  35. out.println("\nFinal path list (using Windows paths):");
  36. out.println(d.getPathsList());
  37. }
  38.  
  39. }
  40.  
  41. class Database {
  42.  
  43. public void add(String p) {
  44. root.add(Arrays.asList(p.split("\\\\|/")), 0);
  45. }
  46.  
  47. public void addAll(Collection<? extends String> list) {
  48. for (String p : list)
  49. add(p);
  50. }
  51.  
  52. public List<String> getPathsList() {
  53. ArrayList<String> list = new ArrayList<>();
  54. root.listPaths(list, "");
  55. return list;
  56. }
  57.  
  58. PathNode root = new PathNode("");
  59.  
  60. static class PathNode {
  61.  
  62. public final String name;
  63. public Map<String, PathNode> children = new HashMap<>();
  64.  
  65. public PathNode(String name) {
  66. this.name = name;
  67. }
  68.  
  69. public boolean isLeaf() {
  70. return children.size()==0;
  71. }
  72.  
  73. public boolean isRoot() {
  74. return name.isEmpty();
  75. }
  76.  
  77. public void add(List<String> path, int i) {
  78. String childName = path.get(i);
  79. PathNode child = children.get(childName);
  80.  
  81. if (child != null) {
  82. if (path.size()-i <= 1) child.children.clear();
  83. else child.add(path, i+1);
  84. } else if (!isLeaf() || isRoot()) {
  85. PathNode node = this;
  86. for (; i < path.size(); i++) {
  87. String key = path.get(i);
  88. node.children.put(key, node = new PathNode(key));
  89. }
  90. }
  91. }
  92.  
  93. public void listPaths(ArrayList<String> list, String prefix) {
  94. for (PathNode child : children.values()) {
  95. if (child.isLeaf()) list.add(prefix+child.name);
  96. else child.listPaths(list, prefix+child.name+File.separator);
  97. }
  98. }
  99.  
  100. }
  101.  
  102. }
  103.  
  104.  
Success #stdin #stdout 0.1s 320576KB
stdin
Standard input is empty
stdout
Final path list (using Unix paths):
[/dev, /usr, /home/user/Desktop/file.txt, /home/user/Documents/file3.txt, /home/user/Documents/file2.txt]

Final path list (using Windows paths):
[C:/dev, C:/usr, C:/home/user/Desktop/file.txt, C:/home/user/Documents/file3.txt, C:/home/user/Documents/file2.txt]