2016-10-13 2 views
-1

Я хочу реализовать следующий код. Требования следующие:Создайте дерево файлов с помощью метода findChild

  1. Завершите конструктор и проверьте, что вы сделали в основном методе.
  2. В методе main создайте дерево с несколькими узлами, затем вызовите findChild для каждого из имен. Они потерпят неудачу. Полный метод findChild пока тесты не пройдут.

Одна вещь, которую я путаю, заключается в том, что FileNode для f1 имеет значение null, а значение null не может быть помещено в hashmap (будет отображаться ошибка нулевого указателя). Как мне сделать, чтобы предотвратить эту проблему.

Вот код, который я сделал

package part2; 

import java.util.Map; 

import javax.swing.JFileChooser; 

import java.io.File; 
import java.util.Collection; 


/** 
* The root of a tree representing a directory structure. 
*/ 
public class FileNode { 

    /** The name of the file or directory this node represents. */ 
    private String name; 
    /** Whether this node represents a file or a directory. */ 
    private FileType type; 
    /** This node's parent. */ 
    private FileNode parent; 
    /** 
    * This node's children, mapped from the file names to the nodes. If type is 
    * FileType.FILE, this is null. 
    */ 
    private Map<String, FileNode> children; 

    /** 
    * A node in this tree. 
    * 
    * @param name 
    *   the file 
    * @param parent 
    *   the parent node. 
    * @param type 
    *   file or directory 
    * @see buildFileTree 
    */ 
    public FileNode(String name, FileNode parent, FileType type) { 
     this.name = name; 
     this.parent = parent; 
     this.type = type; 



     // TODO: complete this method. 
    } 

    /** 
    * Find and return a child node named name in this directory tree, or null 
    * if there is no such child node. 
    * 
    * @param name 
    *   the file name to search for 
    * @return the node named name 
    */ 
    public FileNode findChild(String name) { 
     // TODO: complete this method. 
      if (children.containsKey(name)) { 
       return children.get(name); 
      } 
      else{ 
       return null; 
      } 

    } 

    /** 
    * Return the name of the file or directory represented by this node. 
    * 
    * @return name of this Node 
    */ 
    public String getName() { 
     return this.name; 
    } 

    /** 
    * Set the name of the current node 
    * 
    * @param name 
    *   of the file/directory 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * Return the child nodes of this node. 
    * 
    * @return the child nodes directly underneath this node. 
    */ 
    public Collection<FileNode> getChildren() { 
     return this.children.values(); 
    } 

    /** 
    * Return this node's parent. 
    * 
    * @return the parent 
    */ 
    public FileNode getParent() { 
     return parent; 
    } 

    /** 
    * Set this node's parent to p. 
    * 
    * @param p 
    *   the parent to set 
    */ 
    public void setParent(FileNode p) { 
     this.parent = p; 
    } 

    /** 
    * Add childNode, representing a file or directory named name, as a child of 
    * this node. 
    * 
    * @param name 
    *   the name of the file or directory 
    * @param childNode 
    *   the node to add as a child 
    */ 
    public void addChild(String name, FileNode childNode) { 
     this.children.put(name, childNode); 
    } 

    /** 
    * Return whether this node represents a directory. 
    * 
    * @return whether this node represents a directory. 
    */ 
    public boolean isDirectory() { 
     return this.type == FileType.DIRECTORY; 
    } 

    /** 
    * This method is for code that tests this class. 
    * 
    * @param args 
    *   the command line args. 
    */ 
    public static void main(String[] args) { 
     JFileChooser fileChooser = new JFileChooser(); 
     fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
     int returnVal = fileChooser.showOpenDialog(null); 
     File file; 

     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      file = fileChooser.getSelectedFile(); 
      System.out.println(file); 
     } 
     System.out.println("Testing FileNode"); 
     FileNode f1 = new FileNode("top", null, FileType.FILE); 
     FileNode f2 = new FileNode("top", f1, FileType.FILE); 

     f2 = file; 
     f1.addChild("c1", f2); 

     System.out.println(f2.findChild("c1")); 
     if (!f1.getName().equals("top")) { 
      System.out.println("Error: " + f1.getName() + " should be " + "top"); 
     } 


    } 

} 

и вот сообщение об ошибке:

Exception in thread "main" java.lang.NullPointerException 
    at part2.FileNode.addChild(FileNode.java:126) 
    at part2.FileNode.main(FileNode.java:152) 
+0

Где вам нужно положить null в HashMap? 'this.name = name; this.parent = parent; 'В чем проблема с этим? –

+0

Интерпретировать нулевой родительский элемент как «Нет родителя, поэтому он должен находиться в корневом каталоге», поэтому вы ищете запись в файловой системе «/ » –

+0

Поскольку у вас, похоже, есть «TODO» без какой-либо попытки. [Открытое письмо студентам с проблемами домашних заданий] (http://meta.programmers.stackexchange.com/questions/6166/open-letter-to-students-with-homework-problems) –

ответ

0

FileNode для f1 равно нулю, и нулевое значение не может быть поставлен в HashMap

Я думаю, что null может быть помещен в HashMap, по крайней мере, как значение.

Ошибка означает, что children == null, потому что вы никогда не инициализировали ее! Так что исправить это ...

public void addChild(String name, FileNode childNode) { 
    if (this.children == null) { 
     this.children = new HashMap<String, FileNode>(); 
    } 
    this.children.put(name, childNode); 
} 

Если вы нашли ребенка, вы проверяете только непосредственных детей. Вам нужно итерировать файл-дерево, пока вы не найдете то, что хотите.

public FileNode findChild(String name) { 
    // Base case - no children 
    if (children == null) return null; 

    // Get the child, if exists 
    FileNode immediateChild = children.get(name); 
    if (immediateChild != null) { 
     return children.get(name); 
    } 
    else { // Iterate all children until found 
     FileNode tmp = null; 
     for (FileNode f : getChildren()) { 
      if (tmp != null) break; 
      tmp = f.getChild(name); 
     } 
     return tmp; 
    } 
} 
+0

У него все еще есть ошибка. eclipse сказал, что здесь произошла ошибка: –

+0

this.children.put (name, childNode); –

+0

Тогда 'this.children == null', возможно, который я обрабатываю в своем ответе –

Смежные вопросы