Advertisement
Guest User

Untitled

a guest
Dec 14th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.94 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Set;
  10. import java.util.TreeMap;
  11. import java.util.TreeSet;
  12.  
  13.  
  14. public class SDA1606917802T3 {
  15.     public static void main(String[] args) throws IOException {
  16.         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  17.         String baris;
  18.         //inisiasi class tree
  19.         Tree folderFile = new Tree();
  20.         while ((baris = in.readLine()) != null) {
  21.             String[] input = baris.split(" ");
  22.             if(input[0].equals("add")) {
  23.                 folderFile.add(input[1], input[2]);
  24.             }
  25.             if(input[0].equals("print")){
  26.                 folderFile.print(input[1]);
  27.             }
  28.             if(input[0].equals("insert")) {
  29.                 String[] file = input[1].split("\\.");
  30.                 folderFile.insert(file[0], file[1], Integer.parseInt(input[2]), input[3]);
  31.             }
  32.             if(input[0].equals("remove")) {
  33.                 folderFile.remove(input[1]);
  34.             }
  35.             if (input[0].equals("search")) {
  36.                 folderFile.printSearch(input[1]);
  37.             }
  38.         }
  39.     }
  40. }
  41.     /**
  42.      * membuat class tree menyimpan root, hashmap berisi folder dan file
  43.      *
  44.      * @author putri
  45.      *
  46.      */
  47.     class Tree {
  48.         private Folder root;
  49.         HashMap<String, Folder> folderMap;
  50.         HashMap<String, ArrayList<File>> fileMap;
  51.  
  52.         public Tree() {
  53.             //inisiasi root berupa objek Folder
  54.             this.root = new Folder("root", null);
  55.             //membuat dua hashmap untuk menyimpan data nama folder parent sebagai key dan valuenya adalah anaknya
  56.             // menggunakan ArrayList untuk menyimpan file file yg memiliki nama
  57.             this.fileMap = new HashMap<String, ArrayList<File>>();
  58.             this.folderMap = new HashMap<String, Folder>();
  59.             //menaruh root kedalam map pertama kali
  60.             this.folderMap.put("root", root);
  61.            
  62.         }
  63.  
  64.         /**
  65.          * memasukkan folder ke dalam tree
  66.          *
  67.          * @param folder
  68.          * @param parent
  69.          */
  70.         public void add(String folder, String parent) {
  71.             Folder newFolder = new Folder(folder, folderMap.get(parent));
  72.             folderMap.get(parent).add(newFolder);
  73.         }
  74.  
  75.         /**
  76.          * method updateSize berfungsi untung mengupdate size size folder
  77.          *
  78.          * @param folder
  79.          */
  80.         public void updateSize(String folder) {
  81.             Folder target = folderMap.get(folder);
  82.  
  83.             // membuat size kembali satu agar memudahkan pada saat mengupdate size ketika ada file yang telah dihapus
  84.             target.size = 1;
  85.  
  86.             if (target.children.size() == 0) {
  87.                 for (File file : target.fileSet) {
  88.                     target.size += file.size;
  89.                 }
  90.             } else {
  91.                 for (Folder folders : target.children) {
  92.                     updateSize(folders.name);
  93.                     target.size += folders.size;
  94.                 }
  95.             }
  96.         }
  97.        
  98.         /**
  99.          * method remove menghapus target apabila file serta menghapus folder berikut
  100.          * dengan anak anaknya jika target merupaka folder
  101.          *
  102.          * @param target
  103.          */
  104.         public void remove(String target) {
  105.  
  106.             // apabila target berupa Folder
  107.             if (folderMap.containsKey(target)) {
  108.                 Folder targetFolder = folderMap.get(target);
  109.                 targetFolder.remove();
  110.                 targetFolder.parent.children.remove(targetFolder);
  111.                 folderMap.remove(targetFolder.name);
  112.                 System.out.println("Folder " + targetFolder.name + " removed");
  113.             }
  114.  
  115.             // apabila target berupa File
  116.             if (fileMap.containsKey(target)) {
  117.                 int removedCount = 0;
  118.                 for (File files : fileMap.get(target)) {
  119.                     files.parent.fileSet.remove(files);
  120.                     removedCount++;
  121.                 }
  122.                 fileMap.remove(target);
  123.                 System.out.println(removedCount + " File " + target + " removed");
  124.             }
  125.         }
  126.  
  127.  
  128.         /**
  129.          * method printSearch dipanggil ketika melakukan fungsi search
  130.          *
  131.          * @param target
  132.          */
  133.         public void printSearch(String target) {
  134.             //membuat treemap yang menyimpan info alur pencarian sama files
  135.             Map<String, Set<String>> path = new TreeMap<String, Set<String>>();
  136.             Map<String, List<String>> files = new TreeMap<String, List<String>>();
  137.             // sebagai inisiasi start awal, semua dari root
  138.             path.put("root", new TreeSet<String>());
  139.             //boolean untuk nentuin apakah file tersebut sudah ditemukan
  140.             boolean ketemu = false;
  141.  
  142.             // cek apakah fileMap memiliki target didalamnya dan memastikan map file tersebut tidak kosong
  143.             if (fileMap.containsKey(target) && fileMap.get(target).size() != 0) {
  144.                 ketemu = true;
  145.                 for (File file : fileMap.get(target)) {
  146.                     Folder tempParent = file.parent;
  147.                     if (!files.containsKey(tempParent.name)) {
  148.                         files.put(tempParent.name, new ArrayList<String>());
  149.                     }
  150.                     if (!path.containsKey(tempParent.name)) {
  151.                         path.put(tempParent.name, new TreeSet<String>());
  152.                     }
  153.                     files.get(tempParent.name).add(file.name + "." + file.type);
  154.                     Folder prev = tempParent;
  155.                     tempParent = prev.parent;
  156.                     while (tempParent != null) {
  157.                         if (!path.containsKey(tempParent.name)) {
  158.                             path.put(tempParent.name, new TreeSet<String>());
  159.                         }
  160.                         path.get(tempParent.name).add(prev.name);
  161.                         prev = tempParent;
  162.                         tempParent = prev.parent;
  163.                     }
  164.  
  165.                 }
  166.             }
  167.             // cek apakah dalam FolderMap terdapat target
  168.             if (folderMap.containsKey(target)) {
  169.                 ketemu = true;
  170.                 Folder tempTarget = folderMap.get(target);
  171.                 Folder prev = tempTarget;
  172.                 tempTarget = tempTarget.parent;
  173.                 while (tempTarget != null) {
  174.                     if (!path.containsKey(tempTarget.name)) {
  175.                         path.put(tempTarget.name, new TreeSet<String>());
  176.                     }
  177.                     path.get(tempTarget.name).add(prev.name);
  178.                     prev = tempTarget;
  179.                     tempTarget = tempTarget.parent;
  180.                 }
  181.             }
  182.             // cetak apabila telah ketemu file/foldernya
  183.             if (ketemu) {
  184.                 printPath(path, "root", "> ", files);
  185.             }
  186.         }
  187.  
  188.         /**
  189.          * printPath merupakan method bantuan dari printSearch dengan memakai rekursive
  190.          * dalam melakukan pencarian file
  191.          *
  192.          * @param path
  193.          * @param current
  194.          * @param depth
  195.          * @param files
  196.          */
  197.         public void printPath(Map<String, Set<String>> path, String current, String depth,
  198.             Map<String, List<String>> files) {
  199.             System.out.println(depth + current);
  200.             if (path.containsKey(current)) {
  201.                 for (String next : path.get(current)) {
  202.                     printPath(path, next, "  " + depth, files);
  203.                 }
  204.             }
  205.  
  206.             if (files.containsKey(current)) {
  207.                 for (String file : files.get(current)) {
  208.                     System.out.println("  " + depth + file);
  209.                 }
  210.             }
  211.         }
  212.  
  213.         /**
  214.          * Method print yang dipanggil ketika fungsi Print dijalankan (tidak dipanggil
  215.          * ketika search karena search memiliki printnya sendiri)
  216.          *
  217.          * @param folder
  218.          */
  219.         public void print(String folder) {
  220.             Folder target = folderMap.get(folder);
  221.             updateSize(folder);
  222.             print(target, 0);
  223.         }
  224.  
  225.         /**
  226.          * Method bantuan dari print yang sebelumnya, method ini membuat indentasi dari
  227.          * setiap print print file dan folder
  228.          *
  229.          * @param folder
  230.          * @param depth
  231.          */
  232.         public void print(Folder folder, int depth) {
  233.             int indentasi = depth * 2;
  234.             while (indentasi > 0) {
  235.                 System.out.print(" ");
  236.                 indentasi--;
  237.             }
  238.             System.out.println("> " + folder.name + " " + folder.size);
  239.             if (folder.children.size() == 0) {
  240.                 for (File file : folder.fileSet) {
  241.                     int indentasiFile = depth * 2;
  242.                     while (indentasiFile > 0) {
  243.                         System.out.print(" ");
  244.                         indentasiFile--;
  245.                     }
  246.                     System.out.print("  ");
  247.                     System.out.println("> " + file.name + "." + file.type + " " + file.size);
  248.                 }
  249.             } else {
  250.                 for (Folder folders : folder.children) {
  251.                     print(folders, depth + 1);
  252.                 }
  253.             }
  254.         }
  255.  
  256.         /**
  257.          * Memastikan bahwa setiap file yang dibuat telah di petakan di fileMap
  258.          *
  259.          * @param file
  260.          */
  261.         public void fileMapping(File file) {
  262.             if (!fileMap.containsKey(file.name))
  263.                 fileMap.put(file.name, new ArrayList<File>());
  264.                 fileMap.get(file.name).add(file);
  265.         }
  266.  
  267.         /**
  268.          * Method insert file yang dipanggil ketika fungsi insert dijalankan dan akan
  269.          * menjalakan method insert yang terdapat dalam setiap folder
  270.          *
  271.          * @param name
  272.          * @param type
  273.          * @param size
  274.          * @param folder
  275.          */
  276.         public void insert(String name, String type, int size, String folder) {
  277.             Folder target = folderMap.get(folder);
  278.             File newFile = new File(name, type, size, target);
  279.             target.insert(newFile);
  280.         }
  281.  
  282.         /**
  283.          * class Node yang akan diextends oleh File dan Folder dan mengimplements
  284.          * Comparable
  285.          *
  286.          * @author putri
  287.          *
  288.          */
  289.         class Node implements Comparable<Node> {
  290.             Folder parent;
  291.             String name;
  292.             int size;
  293.  
  294.             public int compareTo(Node other) {
  295.                 if (this.name.compareTo(other.name) == 0) {
  296.                     return this.size - other.size;
  297.                 }
  298.                 else {
  299.                     return this.name.compareTo(other.name);
  300.                 }
  301.             }
  302.  
  303.             public String getName() {
  304.                 return name;
  305.             }
  306.         }
  307.  
  308.         /**
  309.          * class file yang mengextends note
  310.          * @author putri
  311.          *
  312.          */
  313.         class File extends Node {
  314.             private String type;
  315.  
  316.             File(String name, String type, int fileSize, Folder parent) {
  317.                 this.name = name;
  318.                 this.type = type;
  319.                 this.size = fileSize;
  320.             }
  321.         }
  322.  
  323.         /**
  324.          * class folder yg mengextends node
  325.          * @author putri
  326.          *
  327.          */
  328.  
  329.         class Folder extends Node {
  330.             TreeSet<File> fileSet;
  331.             TreeSet<Folder> children;
  332.  
  333.             public Folder(String name, Folder parent) {
  334.                 this.name = name;
  335.                 this.parent = parent;
  336.                 fileSet = new TreeSet<File>();
  337.                 children = new TreeSet<Folder>();
  338.  
  339.             }
  340.  
  341.  
  342.             /**
  343.              * method Add yang berfungsi untuk menambahkan folder baru ke folder target
  344.              * dan memindahkan file ke folder baru yang menjadi folder anak dari
  345.              * folder target
  346.              *
  347.              * @param newFolder
  348.              */
  349.             public void add(Folder newFolder) {
  350.                 if (children.size() == 0) {
  351.                     for (File tempFile : fileSet) {
  352.                         tempFile.parent = newFolder;
  353.                         newFolder.fileSet.add(tempFile);
  354.                     }
  355.                     fileSet.clear();
  356.                     children.add(newFolder);
  357.                 } else {
  358.                     children.add(newFolder);
  359.                 }
  360.                 folderMap.put(newFolder.getName(), newFolder);
  361.             }
  362.  
  363.             /**
  364.              * Method remove yang akan menghapus anak anak dari folder tersebut ketika
  365.              * dihapus
  366.              */
  367.             public void remove() {
  368.                 if (children.size() == 0) {
  369.                     for (File files : fileSet) {
  370.                         fileMap.get(files.name).remove(files);
  371.                     }
  372.                     fileSet.clear();
  373.                 } else {
  374.                     for (Folder folders : children) {
  375.                         folders.remove();
  376.                         folderMap.remove(folders.name);
  377.                     }
  378.                     children.clear();
  379.                 }
  380.             }
  381.  
  382.             public boolean insertAllowed(File file, Folder folderPrev) {
  383.                 if (children.size() == 0) {
  384.                     if (fileSet.isEmpty()) {
  385.                         file.parent = this;
  386.                         fileSet.add(file);
  387.                         fileMapping(file);
  388.                         System.out.println(file.name + "." + file.type + " added to " + file.parent.name);
  389.                         return true;
  390.  
  391.                     }
  392.                     if (file.type.equals(fileSet.first().type)) {
  393.                         file.parent = this;
  394.                         fileSet.add(file);
  395.                         fileMapping(file);
  396.                         System.out.println(file.name + "." + file.type + " added to " + file.parent.name);
  397.                         return true;
  398.                     } else {
  399.                         return false;
  400.                     }
  401.                 } else {
  402.                     if (folderPrev == null) {
  403.                         Iterator<Folder> folderIterator = children.iterator();
  404.                         while (folderIterator.hasNext()) {
  405.                             if (folderIterator.next().insertAllowed(file, null)) {
  406.                                 return true;
  407.                             }
  408.                         }
  409.                         return false;
  410.  
  411.                     } else {
  412.                         Iterator<Folder> tailFolderIterator = children.tailSet(folderPrev, false).iterator();
  413.                         while (tailFolderIterator.hasNext()) {
  414.                             if (tailFolderIterator.next().insertAllowed(file, null))
  415.                                 return true;
  416.                         }
  417.                         Iterator<Folder> headFolderIterator = children.headSet(folderPrev, false).iterator();
  418.                         while (headFolderIterator.hasNext()) {
  419.                             if (headFolderIterator.next().insertAllowed(file, null))
  420.                                 return true;
  421.                         }
  422.                         return false;
  423.                     }
  424.                 }
  425.             }
  426.            
  427.             public void insert(File newFile) {
  428.                 boolean check = this.insertAllowed(newFile, null);
  429.                 Folder folderCheck = this;
  430.                 while (!check) {
  431.                     if (folderCheck.parent == null) {
  432.                         break;
  433.                     }
  434.                     check = folderCheck.parent.insertAllowed(newFile, folderCheck);
  435.                     folderCheck = folderCheck.parent;
  436.  
  437.                 }
  438.             }
  439.         }
  440.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement