我需要的key ==>> value
圖形結構如以下圖像:實用程序圖表操縱在Java
號碼在圓是其節點的密鑰。
我想訪問存儲的值在關鍵2-7-6-5
,我想通過2-7
鍵檢索子圖包含的2
,6-5
,6-11
鍵 - 值凝集,所以我通過嵌套的地圖寫我的執行和它的工作很好,但我問題是:
是否有任何自定義Map
執行或第三方庫解決我的情況來清理我的代碼從手動操作,如String.split
或循環和條件語句?
我需要的key ==>> value
圖形結構如以下圖像:實用程序圖表操縱在Java
號碼在圓是其節點的密鑰。
我想訪問存儲的值在關鍵2-7-6-5
,我想通過2-7
鍵檢索子圖包含的2
,6-5
,6-11
鍵 - 值凝集,所以我通過嵌套的地圖寫我的執行和它的工作很好,但我問題是:
是否有任何自定義Map
執行或第三方庫解決我的情況來清理我的代碼從手動操作,如String.split
或循環和條件語句?
如果您真的只是在尋找一個第三方Java庫來處理圖表,請看JUNG它有很多圖表操作功能。然而,對於你想要達到的目標來說,這可能是矯枉過正的。
我發現的最好的圖庫不是用Java編寫的,而是用Scala編寫的,並且使用了Java中沒有的一些強大的scala特性,比如抽象類型。
它被稱爲Graph for Scala,它非常全面,但我不得不警告你,雖然Scala和Java是互相兼容的(你可以在同一個項目中構建它們並從Scala類中調用Java類, -versa),當涉及Java中不具備的某些功能時,從Java調用Scala時可能會出現一些問題。
這是一個相當簡單的圖表建設和穿越問題。你不需要任何庫。你可以在一個簡單的java類中完成它。對於例如
http://it-essence.xs4all.nl/roller/technology/entry/three_tree_traversals_in_java
是否有任何自定義
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
實例列表,允許你避免經常複製圖結構(非常像字符串緩衝區) 。
你是對的,但我想也許存在一個自定義庫。 – MJM 2012-07-24 05:30:51
這聽起來像你想要實現節點作爲類實例和鏈接作爲參考。使用地圖來實現圖形邊緣將是相當複雜和低效的。難怪你想要清理你的代碼。我不知道我完全理解你的問題,但是這應該是接近:
// 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);
}
}
藉此一個 - 真的很好的圖形操作,也可用於在搖擺
dispaying圖結構<dependency>
<groupId>jgraph</groupId>
<artifactId>jgraph</artifactId>
<version>5.13.0.0</version>
</dependency>
如果您正在尋找圖形數據庫和操縱在Java中,Neo4j可以幫助你。如果你正在尋找一個完美的圖形數據庫和操作API,這可能比你討價還價。
它爲您提供了非常先進的選項來遍歷圖節點,關係,審計。 Neo4j在各個組織中用於存儲非常複雜的分層數據,Neo4j的性能遠遠優於基於Oracle R-DB的複雜分層數據庫。
謝謝,但我想用'Java'。 – MJM 2012-07-23 10:49:14
1984我不喜歡你的意思。 – MJM 2012-07-23 11:14:05
我不會花時間試着解釋爲什麼如果你有一個用Java編寫的現有項目,你可能想在Scala中繼續這個項目,但是告訴我那就是它。 – Edmondo1984 2012-07-23 11:26:32