какую структуру данных использовать в моем случае? - PullRequest
1 голос
/ 26 мая 2011

A FileManager Класс имеет статическое поле для хранения коллекции файлов, эта коллекция может содержать файлы или папки, или обе, папка может содержать файлы или папки, или обе, класс FileManager содержит открытый метод для кода клиента длявызовите такие как addFile, addFolder, deleteFile, deleteFolder, эти методы работают с коллекцией.Мой вопрос:Какая структура данных Java лучше всего подходит для этого случая?Как создать класс модели для файлов и папок?

хороший пример.

наилучшие пожелания.

// добавлено @ 2011/05/27 спасибо всем!acutaly Я пытаюсь создать приложение eclipse-rcp для управления некоторым профилем соединения jdbc.вот мой код:

package com.amarsoft.sysconfig.plugin.model;

/**
 * @author ggfan@amarsoft
 *
 */
public class TreeNode {

    /**
     * unique key
     */
    private String key;

    /**
     * used as label in a JFace TreeViewer, 
     */
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }


}

public class LeafNode extends TreeNode {

    private FolderNode parent;

    public void setParent(FolderNode parent) {
        this.parent = parent;
    }

    public TreeNode getParent() {
        return parent;
    }
}

пакет com.amarsoft.sysconfig.plugin.model;

import java.util.List;

public class FolderNode extends TreeNode {

    private List<TreeNode> children;

    public void setChildren(List<TreeNode> children) {
        this.children = children;
    }

    public List<TreeNode> getChildren() {
        return children;
    }
}




package com.amarsoft.sysconfig.plugin.model;

import org.dom4j.Element;
import org.dom4j.tree.DefaultElement;

/**
 * 连接配置模型类
 * @author ggfan@amarsoft
 *
 */
public class ConnectionProfile extends LeafNode{

    /**
     * url
     */
    private String url;

    /**
     * JDBC driver id
     */
    private int driver;

    /**
     * user name for logon
     */
    private String user;

    /**
     * password for logon
     */
    private String pswd;

    /**
     * default constructor
     */
    public ConnectionProfile() {

    }

    /**
     * construct a instance using a XML element
     * @param xmlElement the XML element
     */
    public ConnectionProfile(Element xmlElement){
        this.setName(xmlElement.attributeValue("name"));
        this.setUrl(xmlElement.element("url").getTextTrim());
        this.setUser(xmlElement.element("user").getTextTrim());
        this.setPswd(xmlElement.element("password").getTextTrim());
    }

    /**
     * serialize as XML
     * @return
     */
    public Element asXML(){
        Element e = new DefaultElement("profile");
        e.addAttribute("name", this.getName());
        e.addElement("url", escapeNull(this.getUrl()));
        e.addElement("user", escapeNull(this.getUser()));
        e.addElement("password", escapeNull(this.getPswd()));
        return e;
    }

    private String escapeNull(String s) {
        return s == null ? "" : s;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPswd() {
        return pswd;
    }

    public void setPswd(String pswd) {
        this.pswd = pswd;
    }

    public void setDriver(int driver) {
        this.driver = driver;
    }

    public int getDriver() {
        return driver;
    }

}

открытый класс ConnectionProfileManager{

private static List<TreeNode> profiles = new ArrayList<TreeNode>();

public static void loadProfiles() throws DocumentException{
    Element profiles = XMLUtil.readRoot(ConnectionProfileManager.class.getResourceAsStream("samples_profile.xml"));
    //Element profiles = XMLUtil.readRoot(new File(ApplicationFiles.CONNNECTION_PROFILES));
    if(profiles != null){
        for(Element profile : profiles.elements()){
            loadNode(profile, ConnectionProfileManager.profiles);
        }
    }
}


private static void loadNode(Element node, List<TreeNode> parent){
    if(node.getName().equals(XMLConstants.CP_TAG_PROFILE)){
        ConnectionProfile profile = new ConnectionProfile(node);
        parent.add(profile);
    }else if(node.getName().equals(XMLConstants.CP_TAG_FOLDER)){
        FolderNode folder = new FolderNode();
        folder.setChildren(new ArrayList<TreeNode>());
        folder.setName(node.attributeValue(XMLConstants.CP_ATTR_NAME));
        for(Element child : node.elements()){
            loadNode(child, folder.getChildren());
        }
        parent.add(folder);
    }
}

public static void saveProfiles(){
    Element root = new DefaultElement(XMLConstants.CP_TAG_PROFILES);
    for(TreeNode node : ConnectionProfileManager.profiles){
        saveNode(node, root);
    }

    XMLUtil.save(root, new File("c:\\1.xml"));
}

private static void saveNode(TreeNode node, Element root) {
    if(node instanceof ConnectionProfile){
        ConnectionProfile p = (ConnectionProfile)node;
        root.add(p.asXML());
    }else if(node instanceof FolderNode){
        FolderNode folder = (FolderNode)node;
        Element e = new DefaultElement(XMLConstants.CP_TAG_FOLDER);
        e.addAttribute(XMLConstants.CP_ATTR_NAME, node.getName());
        for(TreeNode child : folder.getChildren()){
            saveNode(child, e);
        }
        root.add(e);
    }
}


public static void addProfile(ConnectionProfile profile){
    profiles.add(profile);
}

public static void addProfile(TreeNode parentNode, ConnectionProfile profile){

}

public static List<TreeNode> getProfiles() {
    return profiles;
}

}

с этим классом у меня работает дерево, но я обнаружил, что трудно добавить операцию добавления.

Ответы [ 2 ]

4 голосов
/ 26 мая 2011

Вы вроде как продиктовали ответ уже в вопросе ..

Класс File (в соответствии с JavaDocs ):

абстрактное представление имен файлов и каталогов.

Итак, из того, что вы описали:

 // A file manager class
 class FileManager {

     // has a static field to hold a file collection 
     static Collection<File> fileCollection;

     // contains public methods such as
     public addFile(File f) { }
     public deleteFile(File f) { }
     public addFolder(File f) { }
     public deleteFolder(File f { }
 }

Если вам нужно взглянуть на реализацию собственной версии File class, тогда JavaDocs для этого должен стать хорошим началом для понимания этого.

Что касается того, какая коллекция лучше всего подходит для коллекции файлов, я думаю, Set имеет больше смысла.Нет смысла иметь более одного файла (например, список и две записи одного и того же файла были бы бессмысленными), и тестирование членства в наборе - очень быстрая операция.Например, в addFile вы можете проверить, что он существует, прежде чем пытаться добавить, и аналогично для delete вы хотите убедиться, что он существует, прежде чем удалить его.

Несколько замечаний одизайн, который вы упомянули.

  1. Статические поля, как это неприятно.Они затрудняют тестирование и являются болью для многопоточности.Не могли бы вы сделать его переменной экземпляра?

  2. Учитывая, что File является абстрактным представлением имени пути, зачем вам нужны методы addFile и addFolder, онибудет та же реализация?

2 голосов
/ 26 мая 2011

A Коллекция из Файл s?

Большинство коллекций поддерживают добавление и удаление, поэтому нет необходимости в специальной структуре данных. Файл Java может быть файлом и каталогом. Просто позвоните isDirectory , чтобы узнать, каталог это или файл.

Если у вас нет дополнительных требований, я думаю, что это довольно простой в использовании FileManager:

List<File> fileManager = new ArrayList<File>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...