java中图形操作的实用程序

时间:2012-07-08 12:19:40

标签: java collections graph map treemap

我需要key ==>> value的图形结构,例如下图:

enter image description here

圆圈中的数字是其节点的关键。

我想要访问密钥2-7-6-5中的存储值,并且我想通过2-7密钥检索子图包含26-5,{{1}的collectin } keys-values,所以我通过嵌套地图编写了我的实现,它运行正常,但我的问题是:

是否有任何自定义6-11实现或第三方库来解决我的情况,以便手动清除我的代码,例如Map或循环和条件语句?

7 个答案:

答案 0 :(得分:3)

如果您真的只是在寻找第三方Java库来处理图形,请查看JUNG它有很多图形处理功能。但是,对于你想要实现的目标来说,这可能是过度的。

答案 1 :(得分:3)

选择这一个 - 非常适合图形操作,也适用于显示摆动中的图形结构

<dependency>
    <groupId>jgraph</groupId>
    <artifactId>jgraph</artifactId>
    <version>5.13.0.0</version>
</dependency>

http://www.jgraph.com

答案 2 :(得分:2)

这是一个相当简单的图形构造和遍历问题。您不需要任何库。你可以在一个简单的java类中完成它。例如,

http://it-essence.xs4all.nl/roller/technology/entry/three_tree_traversals_in_java

答案 3 :(得分:1)

听起来你想要将节点实现为类实例和链接作为引用。使用map来实现图形边缘将非常复杂且效率低下。难怪你想要清理你的代码。我不确定我是否完全理解你的问题,但这应该很接近:

// Null nodes are the simplest type. They represent missing children.
class NullNode {

    // Get the values of all leaves descended from this node as a set.
    Set<Integer> getValues() { return new HashSet(0); }

    // Get the values descended from the node at the end of the given
    // key path as a set.  For a null node, this should not be called.
    Set<Integer> getValues(int [] path, int i) { raise new IllegalOperationException(); }

    // Initiate the search for values.  The only way that's okay
    // for null nodes is when the path is empty.
    Set<Integer> getValues(int [] path) {
        if (path.length == 0)
            return new HashSet(0);
        else
            raise new IllegalOperationException();
    }
}

// A regular node is a null node with a key. It should
// never be instantiated. Use Interior or Leaf nodes for that.
abstract class Node extends NullNode {

    int key;

    // Initiate the search for values.  Only descend if the key matches.
    Set<Integer> getValues(int [] path) {
        return (path.length > 0 && path[0] == key) ? getValues(path, 1) : new HashSet(0);
    }
}

// Interior nodes have two children, which may be Null, Interior, or Leaf.
class InteriorNode extends Node {

    Node left, right;

    Set<Integer> getValues() {
        Set<Integer> v = left.getValues();
        v.addAll(right.getValues());
        return v;
    }

    Set<Integer> getValues(int [] path, int i) {
        if (i + 1 < path.length) {
            // Again we only descend if the key matches.
            if (path[i + 1] == left.key)  return getValues(left, i + 1);
            if (path[i + 1] == right.key) return getValues(right, i + 1);
            return new HashSet(0);
        }
        return getValues(); // Get values from both children.
    }
}

// A leaf node has no children and a value.
class LeafNode extends Node {

    int value;

    Set<Integer> getValues() {
        HashSet<Integer> v = new HashSet(1);
        v.add(value);
        return v;
    }

    Set<Integer> getValues(int [] path, int i) {
        return (i + 1 >= path.length) ? getValues() : new HashSet(0);
    }

}

答案 4 :(得分:0)

我发现的最好的图形库不是用Java编写的,而是用Scala编写的,并且使用了Java中没有的一些强大的scala功能,例如抽象类型。

它被称为Scala的Graph并且它非常全面,但我必须警告你,虽然Scala和Java它们是互相兼容的(你可以在同一个项目中构建它们并从Scala类调用Java类,而且 - 反之亦然,当谈到Java中没有的一些功能时,从Java调用Scala时可能会出现一些问题。

http://www.assembla.com/spaces/scala-graph/wiki

答案 5 :(得分:0)

  

是否有任何自定义Map实现或第三方库来解决我的情况,以便手动清除我的代码,例如String.split或循环和条件语句?

如果要删除编写操作代码的自由,则可以创建自己的库。您可以通过将类导出到Jar文件中轻松地在Eclipse中创建库,我认为这是NetBeans中的一项简单任务。

如果要在构建后防止对图形的更改,则需要创建不可变数据结构。使用不可变图形结构,您必须将图形视为Universe,并且每个操作都是GraphOperation。您永远不能修改图表,只能创建一个新图表,该图表是通过Graph与GraphOperations列表交叉而产生的。假设您的Graph结构包含唯一的节点值,这不会造成太大的问题,因为您可以愉快地使用值来描述关系。您的代码将如下所示:

Graph graph2 = graph1.process(graph1.GetTopNode().RemoveLeft());
graph2 = graph2.process(graph2.GetNode(7).AddRight(8));

GetTopNode()返回仅提供节点视图的对象。 RemoveLeft()返回GraphOperation个对象,Graph.process()用于从操作中创建新图表。如果需要,它可以返回一个Graph实现,在内部存储到graph1的链接,以及已传递给它的GraphOperation个实例列表,允许您避免复制图形结构太频繁了(非常像字符串缓冲区)。

答案 6 :(得分:0)

如果您正在寻找Java中的Graph数据库和操作,Neo4j可能会对您有所帮助。如果您正在寻找一个完美的图形数据库和操作API,这可能比您所讨论的更多。

它为您提供了非常高级的选项来遍历图节点,关系和审计。 Neo4j被用于跨组织存储非常复杂的分层数据,Neo4j的性能远远优于基于oracle的R-DB用于复杂的分层数据库。