我需要key ==>> value
的图形结构,例如下图:
圆圈中的数字是其节点的关键。
我想要访问密钥2-7-6-5
中的存储值,并且我想通过2-7
密钥检索子图包含2
,6-5
,{{1}的collectin } keys-values,所以我通过嵌套地图编写了我的实现,它运行正常,但我的问题是:
是否有任何自定义6-11
实现或第三方库来解决我的情况,以便手动清除我的代码,例如Map
或循环和条件语句?
答案 0 :(得分:3)
如果您真的只是在寻找第三方Java库来处理图形,请查看JUNG它有很多图形处理功能。但是,对于你想要实现的目标来说,这可能是过度的。
答案 1 :(得分:3)
选择这一个 - 非常适合图形操作,也适用于显示摆动中的图形结构
<dependency>
<groupId>jgraph</groupId>
<artifactId>jgraph</artifactId>
<version>5.13.0.0</version>
</dependency>
答案 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时可能会出现一些问题。
答案 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用于复杂的分层数据库。