首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的树形结构?

问Java中的树形结构?
EN

Stack Overflow用户
提问于 2014-06-27 10:53:33
回答 2查看 247关注 0票数 0

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

代码语言:javascript
复制
T randomObject = new randomObject();
Node<T> root;
root.setObject(randomObject);
root.addChild( ... 
....
root.getFirstChild().getObject().getObjectProperty();

我研究了节点结构(org.w3c.dom.Node),但它似乎不能存储对象,似乎更多地用于解析文档。

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

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

EN

回答 2

Stack Overflow用户

发布于 2016-03-31 06:01:49

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

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

代码语言:javascript
复制
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;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-06-27 11:42:43

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

代码语言:javascript
复制
public class MyTreeNode extends DefaultMutableTree{
  //add all your objects here
}

DefaultMutableTree有像add() ->这样的预定义方法来添加子节点,它使用枚举并提供标准方法来使用preorder和postorder处理来访问子节点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24443217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档