在我的情况下要使用什么数据结构?

问题描述

|
FileManager
类具有用于保存文件集合的静态文件,此集合可以包含文件或文件夹,或者两者都包含,文件夹可以包含文件或文件夹,或两者都包含,
FileManager
类包含用于客户端代码调用的公共方法,例如
addFile
addFolder
deleteFile
deleteFolder
,这些方法作用于集合。我的问题是: 什么Java数据结构最适合这种情况? 如何为文件和文件夹创建模型类? 一些例子会很好。 最好的国王。 //添加@ 2011/05/27 谢谢大家! 我试图建立一个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; 导入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;
}
} 通过这些类,我得到了我的树,但是我发现很难支持添加操作。     

解决方法

您已经决定了问题中的答案。
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
类版本,那么对此的JavaDocs应该是理解这一点的一个良好的开端。 至于哪种收集最适合文件收集,我认为12英镑最有意义。拥有一个以上的文件是没有意义的(例如,列表和同一文件的两个条目将毫无意义),并且测试集合的成员资格是一项非常快速的操作。例如,在
addFile
中,您可以在尝试添加之前检查它是否存在,对于
delete
,类似地,您想要在删除它之前确保它存在。 关于您提到的设计的几点要点。 像这样的静态字段令人讨厌。它们使测试变得困难,并且是多线程的痛苦。您可以将其设置为实例变量吗? 假设ѭ9是路径名的抽象表示,为什么您需要方法
addFile
addFolder
,它们将具有相同的实现?     ,文件集合? 大多数集合支持添加和删除,因此不需要特殊的数据结构。 Java File可以是文件和目录。只需调用isDirectory即可确定它是目录还是文件。 除非您有更多要求,否则我认为这将构成一个非常易于使用的FileManager:
List<File> fileManager = new ArrayList<File>();
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...