gpt4 book ai didi

java - 在我的案例中使用什么数据结构?

转载 作者:行者123 更新时间:2023-11-29 07:19:40 24 4
gpt4 key购买 nike

FileManager 类有一个静态文件来保存文件集合,这个集合可能包含文件或文件夹或两者,文件夹可能包含文件或文件夹或两者,FileManager 类包含客户端代码调用的公共(public)方法,如addFileaddFolderdeleteFiledeleteFolder,这些方法对集合进行操作。
我的问题是:
哪种 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;

导入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;
}

}

公共(public)类 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 )是:

abstract representation of file and directory pathnames.

根据您的描述:

 // 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 应该是理解这一点的良好开端。

至于什么集合最适合文件集合,我认为 Set 最有意义。拥有多个文件是没有意义的(例如,一个列表和同一文件的两个条目将毫无意义),并且测试集合的成员资格是一项非常快速的操作。例如,在 addFile 中,您可能会在尝试添加之前检查它是否存在,同样对于 delete,您希望在删除它之前确保它存在。

关于您提到的设计的几点。

  1. 像这样的静态字段很讨厌。它们使测试变得困难并且对多线程来说是一种痛苦。你能把它变成一个实例变量吗?

  2. 鉴于 File 是路径名的抽象表示,为什么您需要方法 addFileaddFolder,他们会有相同的实现吗?

关于java - 在我的案例中使用什么数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6136233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com