2012-07-08 70 views
2

我需要的key ==>> value圖形結構如以下圖像:實用程序圖表操縱在Java

enter image description here

號碼在圓是其節點的密鑰。

我想訪問存儲的值在關鍵2-7-6-5,我想通過2-7鍵檢索子圖包含的26-56-11鍵 - 值凝集,所以我通過嵌套的地圖寫我的執行和它的工作很好,但我問題是:

是否有任何自定義Map執行或第三方庫解決我的情況來清理我的代碼從手動操作,如String.split或循環和條件語句?

回答

3

如果您真的只是在尋找一個第三方Java庫來處理圖表,請看JUNG它有很多圖表操作功能。然而,對於你想要達到的目標來說,這可能是矯枉過正的。

0

我發現的最好的圖庫不是用Java編寫的,而是用Scala編寫的,並且使用了Java中沒有的一些強大的scala特性,比如抽象類型。

它被稱爲Graph for Scala,它非常全面,但我不得不警告你,雖然Scala和Java是互相兼容的(你可以在同一個項目中構建它們並從Scala類中調用Java類, -versa),當涉及Java中不具備的某些功能時,從Java調用Scala時可能會出現一些問題。

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

+0

謝謝,但我想用'Java'。 – MJM 2012-07-23 10:49:14

+0

1984我不喜歡你的意思。 – MJM 2012-07-23 11:14:05

+0

我不會花時間試着解釋爲什麼如果你有一個用Java編寫的現有項目,你可能想在Scala中繼續這個項目,但是告訴我那就是它。 – Edmondo1984 2012-07-23 11:26:32

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實例列表,允許你避免經常複製圖結構(非常像字符串緩衝區) 。

+0

你是對的,但我想也許存在一個自定義庫。 – MJM 2012-07-24 05:30:51

1

這聽起來像你想要實現節點作爲類實例和鏈接作爲參考。使用地圖來實現圖形邊緣將是相當複雜和低效的。難怪你想要清理你的代碼。我不知道我完全理解你的問題,但是這應該是接近:

// 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); 
    } 

}

3

藉此一個 - 真的很好的圖形操作,也可用於在搖擺

dispaying圖結構
<dependency> 
    <groupId>jgraph</groupId> 
    <artifactId>jgraph</artifactId> 
    <version>5.13.0.0</version> 
</dependency> 

http://www.jgraph.com

0

如果您正在尋找圖形數據庫和操縱在Java中,Neo4j可以幫助你。如果你正在尋找一個完美的圖形數據庫和操作API,這可能比你討價還價。

它爲您提供了非常先進的選項來遍歷圖節點,關係,審計。 Neo4j在各個組織中用於存儲非常複雜的分層數據,Neo4j的性能遠遠優於基於Oracle R-DB的複雜分層數據庫。