2014-11-22 6 views
0

Итак, я создал класс для моего общего дерева и класса Node, который вместе с ним. Классы следующие:Trouble Implementing Generic Tree

public class DirectoryTree<E> implements Serializable { 
    protected Node<E> root; 
    protected Node<E> child; 

    public DirectoryTree() { 
     root = null; 
    }//end constructor 

    protected DirectoryTree(Node<E> root) { 
     this.root = root; 
    } 

    public boolean isLeaf() { 
     return root.children == null; 
    } 

    public DirectoryTree<E> getTree() { 
     if (root != null) { 
      return new DirectoryTree<E>(root); 
     }//end if 
     else { 
      return null; 
     }//end else 
    } 


    public Node<E> getRoot() { 
     return root; 
    } 

    public Node<E> getChild() { 
     return child; 
    } 

    public String toString() { 
     return null; 

    }//end toString() 


} 

class Node<E> implements Serializable { 
    protected Node<E> parent; 
    protected E data; 
    protected ArrayList<Node<E>> children; 

    public Node(E data) { 
     this.data = data; 
     children = new ArrayList<Node<E>>(); 
    } 

    public Node<E> getParent() { 
     return parent; 
    } 

    public ArrayList<Node<E>> getChildren() { 
     return this.children; 
    } 

    public int getNumberOfChildren() { 
     return getChildren().size(); 
    } 

    public boolean hasChildren() { 
     return getChildren().size() > 0; 
    } 

    public void addChild(Node<E> child) { 
     int counter = 0; 
     for (int i = 0; i < children.size(); i++) { 
      if (child == children.get(i)) { 
       System.out.println("directory exists"); 
       counter++; 
      } 
     } 
     if (counter == 0) { 
      children.add(child); 
     } else { 
     } 
    } 

    public E getData() { 
     return this.data; 
    } 

    public String toString() { 
     return data.toString(); 
    } 


} 

Мне интересно, правильно ли установлены мои 2 класса для общего дерева. Кроме того, я не уверен, как реализовать это дерево в программе. Моя программа должна быть программой, которая создает каталоги и файлы и помещает их в дерево. Мой корневой каталог должен иметь имя /. До сих пор мой основной класс (я только начал его):

public class Driver { 

    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     System.out.println("Welcome to Fake Unix"); 
     System.out.print("$"); 
     File f = new File("//"); 
     String input = in.nextLine(); 
     DirectoryTree tree = new DirectoryTree(new Node<File>(f)); 
     while (!input.equalsIgnoreCase("exit")) { 
      String[] command = input.split(" "); 
      if (command[0].equals("mkdir") && command[1].equals("-p") && command.length == 3) { 
       File f1 = new File(command[2]); 
       tree.root.addChild(new Node<File>(f1)); 
       System.out.println("complete"); 
      }//end if 

      if (input.equals("tree")) { 
       System.out.println(tree.toString()); 
      } 
      System.out.print("$"); 
      input = in.nextLine(); 
     }//end while 

    }//end main 
}//end class 

Так что я в основном спрашиваю, если мои методы выглядеть правильно в моих деревьев и узлов классов, и я или нет я движется в правильном направлении реализации их в основном классе. Правильно ли я создаю каталоги или неправильно ли синтаксис?

Спасибо.

+0

любой человек ???????? – user3554599

+0

Вы пытались запустить свой класс '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'и были проверены, – Foxsly

+0

ну, я не получаю никаких ошибок. но как я могу проверить, создан ли каталог? @Foxsly – user3554599

ответ

0

Я предполагаю, что вы хотите, чтобы каталоги создавались в вашей файловой системе. Некоторые копания через File javadocs указывает, что вам нужно позвонить file.mkdir() для каждой добавляемой вами директории.

Насколько ваши классы идут:

  1. Я не вижу использование для protected Node<E> child в DirectoryTree. У вас есть корень, и если это то, что дерево будет удерживать, вы можете перейти к любым дочерним элементам через этот узел.
  2. В настоящее время у вас нет способа установить protected Node<E> parent в Node. Если вам когда-нибудь понадобится, чтобы перемещаться вверх по дереву от дочернего элемента, который был бы полезен - вы бы по существу, необходимо реализовать Doubly linked list
  3. Вы не должны получать доступ к переменным-членам Node непосредственно из DirectoryTree (см isLeaf() метод). Используйте геттеры на Node, например Node#getChildren()
+0

. Я ценю ваши отзывы. То, что я смущен, - это то, как хранить каталоги в узлах. file.mkdir() возвращает логическое значение, чтобы указать, был ли каталог создан или нет. Мой вопрос: как я могу хранить каталоги в узлах основного метода? @Foxsly – user3554599

+0

Вы уже есть. «Файл» может представлять собой файл или каталог, поэтому, когда вы добавляете узел в дерево (или добавляете его как дочерний узел другого узла), он отображается в дереве. – Foxsly

+0

поэтому, чтобы добавить другого ребенка в корень, я бы просто вызвал tree.root.addChild ()? Как насчет того, хочу ли я добавить ребенка к другому, кроме корня? Извините, если я не знаю, я просто пытаюсь понять деревья лучше. @Foxsly – user3554599