Why Java Collection Framework doesn't contain Tree and Graph

前端 未结 6 1911
太阳男子
太阳男子 2020-12-05 06:39

I am familiar with Java Collection Framework which contains basic interfaces: Collection and Map. I am wondering why the Framework doesn\'t contain

6条回答
  •  温柔的废话
    2020-12-05 07:11

    There is an interface for trees - javax.swing.tree.TreeModel, which in fact works for arbitrary directed graphs (with a distinguished "root" node). It does not implement the Collection interface, though (since Swing is a bit older than the collection framework, and it is not really clear that being a collection would really be appropriate here). (One implementation of TreeModel is DefaultTreeModel, which uses a tree build from TreeNode objects, which is itself an interface implementable by users.)

    Another type of trees are given by the XML-DOM frameworks. Some specific use trees (or mostly "tree nodes") are defined by java.io.File, java.awt.Component (and subclasses), the Compiler tree API (com.sun.source.tree.*), the Doclet API (com.sun.javadoc.*), the Reflection API (java.lang.Class), the language model API (javax.lang.**).

    If you compare these API

    The problem is, there is no clear general-purpose useful interface for trees - what should such a tree be able to do? Is a tree simply a collection of other trees (those one level lower), or simply a pointer to the root node, where each node itself contains more nodes? Or is a tree a collection of all the nodes? Or a collection of all the contents of all the nodes? Do all nodes have to have "content", or only the leaf nodes? If a tree were a collection of some content elements (and not the nodes itself), how should an iterator behave? What would be the size of a tree?

    Here is a proposal for a tree node (or in fact it could be a general directed graph node, if not for the parent-pointer) interface:

    /**
     * A general interface for a tree node.
     * @param  the concrete node type.
     */
    public interface Node> {
    
       /**
        * equivalent to {@link #children children()}.{@link Collection#isEmpty isEmpty()}.
        * @returns true, if this is a leaf node, else false.
        */
       public boolean isLeaf();
    
       /**
        * returns a collection of all children of this node.
        * This collection can be changed, if this node is mutable.
        */
       public Collection children();
       /**
        * returns the parent of this node.
        * @return null, if this is the root node, or the node does not know its parent, or has multiple parents.
        */
       public N parent();
    }
    
    /**
     * a tree node with content objects.
     * @param  the concrete node type
     * @param  the type of the content of this node.
     */
    public interface ContentNode>
              extends Node
    {
       /**
        * returns the content of this node, if any.
        */
       public C content();
    }
    

    Would this be enough for all types of trees, for example the ones listed above? I don't think so.

提交回复
热议问题