【问题标题】:Tree structure in Java?Java中的树结构?
【发布时间】:2014-06-27 02:53:33
【问题描述】:

我想实现一个树形结构。树中的每个节点都包含我选择的对象,以及到每个孩子(可能还有父母)的链接。我想知道Java中是否存在类似的东西,例如:

T randomObject = new randomObject();
Node<T> root;
root.setObject(randomObject);
root.addChild( ... 
....
root.getFirstChild().getObject().getObjectProperty();

我研究了 Node 结构 (org.w3c.dom.Node),但它似乎无法存储对象,而且似乎更适合解析文档。

我还研究了诸如 DefaultMutableTreeNode、MutableTreeNode 和 TreeNode 之类的东西,但我无法找到明确的使用示例。我在这些方面遇到了很多问题。例如,当将 DefaultMutableTreeNode 作为参数传递时(似乎不起作用),或者在获取 DefaultMutableTreeNode 的子节点时,它似乎只返回一个 TreeNode,而我显然已将 DefaultMutableTreeNode 添加为子节点。

我是 Java 新手,所以任何信息都会非常有帮助。 Oracle 文档没有那么有用。我使用过 Vector 结构,它非常易于使用,可以存储对象并且易于访问,并且想知道是否存在类似的东西。谢谢。

【问题讨论】:

  • 嗯,TreeMap 是一张由红黑树支持的地图。您到底要构建什么样的树?
  • 据我所知,Java 并没有以这种方式预先实现树数据结构。然而,网上有很多好的,而且很容易制作或修改网上找到的。查看“java 树实现”的 Google 结果:google.com/…

标签: java tree


【解决方案1】:

查看https://github.com/poshjosh/bcuitreebuilder

一个用于从文档、文件等构建 TreeNode 的轻量级 java 库

public class ReadMe {

    public static void main(String [] args) {

        TreeBuilderFactory treeBuilderFactory = new TreeBuilderFactoryImpl();

        // For displaying each JTree
        //
        JScrollPane scrollPane  = new JScrollPane();
        scrollPane.setBounds(0, 0, 300, 300);

        // DocumentTreeBuilder 
        //
        Document doc = loadDocument(
             new File(System.getProperty("user.home")+"/Documents/Desktop/welcome.xml"));

        DOMTreeBuilder domTreeBuilder = treeBuilderFactory.getDOMInstance();

        Filter<Node> nodeFilter = null; // May be null

        TreeNode docRootNode = domTreeBuilder.build(doc, nodeFilter);

        JTree documentTree = new JTree(docRootNode);

        // Display the JTree
        //
        scrollPane.setViewportView(documentTree);
        JOptionPane.showMessageDialog(null, scrollPane);


        // FileTreeBuilder
        //
        File dir = new File(System.getProperty("user.home")+"/Documents");

        TreeBuilder<File> fileTreeBuilder = 
                 treeBuilderFactory.getInstance(TreeBuilderFactory.FILE);
        // This also works
        //FileTreeBuilder fileTreeBuilder = treeBuilderFactory..getFileInstance(); 

        Filter<File> fileFilter = new Filter<File>() {
            @Override
            public boolean accept(File f) {
                return f.isDirectory() || f.getName().endsWith(".docx");
            }
        };

        TreeNode fileRootNode = fileTreeBuilder.build(dir, fileFilter);

        JTree fileTree = new JTree(fileRootNode);

        // Display the JTree
        //
        scrollPane.setViewportView(fileTree);
        JOptionPane.showMessageDialog(null, scrollPane);


        // MapTreeBuilder
        //
        MapTreeBuilder mapTreeBuilder = treeBuilderFactory.getMapInstance();

        final HashMap map = new HashMap();
        map.put("boolean", Boolean.TRUE);
        map.put("number", 100);
        map.put("List", new String[]{"1", "2", "3"});
        HashMap grandChildren = new HashMap();
        grandChildren.put("grandChild", "I am a grand child");
        map.put("hasChildren", grandChildren);

        Map.Entry rootEntry = mapTreeBuilder.createRootEntry(map);

        TreeNode mapRootNode = mapTreeBuilder.build(rootEntry, null);

        JTree mapTree = new JTree(mapRootNode);

        // Display the JTree
        //
        scrollPane.setViewportView(mapTree);
        JOptionPane.showMessageDialog(null, scrollPane);
    }

    private static Document loadDocument(File file) {
        Document doc;
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = factory.newDocumentBuilder();
            doc = docBuilder.parse(file);
        }catch (SAXException | IOException | ParserConfigurationException e) {
            e.printStackTrace();
            doc = null;
        }
        return doc;
    }
}

【讨论】:

    【解决方案2】:

    几天前我想要类似的东西。这就是我所做的:

    public class MyTreeNode extends DefaultMutableTree{
      //add all your objects here
    }
    

    DefaultMutableTree 具有预定义的方法,例如 add() -> 添加子节点,它使用枚举并提供标准方法来使用前序和后序处理访问子节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多