2

key ==>> value次の画像のようなグラフ構造が必要でした:

ここに画像の説明を入力

丸の中の数字はそのノードのキーです。

キーに格納された値へのアクセスが必要で、サブグラフに, , keys-values のコレクションが含まれているキーを取得する必要があったため、ネストされたマップで実装を記述し、正常に機能しましたが、2-7-6-5私の質問は次のとおりです。2-726-56-11

またはループや条件ステートメントなどの手動操作からコードをクリーンアップするために、状況を解決するためのカスタムMap実装またはサードパーティ ライブラリはありますか?String.split

4

7 に答える 7

3

これを見てください - グラフの操作や、swing でグラフ構造を表示するのに非常に適しています

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

http://www.jgraph.com

于 2012-07-27T13:07:33.347 に答える
3

グラフを操作するためのサードパーティの Java ライブラリを探しているだけの場合は、JUNGを参照してください。JUNGには、グラフ操作のための機能がたくさんあります。ただし、達成しようとしているものにはやり過ぎかもしれません。

于 2012-07-25T19:03:54.180 に答える
2

これはかなり単純なグラフの構築とトラバーサルの問題です。ライブラリは必要ありません。簡単なJavaクラスでそれを行うことができます。例えば

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

于 2012-07-23T12:53:53.263 に答える
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);
    }

}

于 2012-07-26T03:11:18.157 に答える
0

またはループや条件ステートメントなどの手動操作からコードをクリーンアップするために、状況を解決するためのカスタムMap実装またはサードパーティ ライブラリはありますか?String.split

コードを操作する自由を取り除きたい場合は、独自のライブラリを作成できます。クラスを Jar ファイルにエクスポートすることで、Eclipse でライブラリを簡単に作成できます。これは、NetBeans では簡単な作業だと思います。

構築後にグラフが変更されないように保護するには、不変のデータ構造を作成する必要があります。不変のグラフ構造では、グラフをユニバースとして表示する必要があり、各操作は GraphOperation です。Graph を変更することはできません。Graph と GraphOperations のリストを交差させた結果の新しい Graph を作成するだけです。グラフ構造が一意のノード値を保持していると仮定すると、値を使用して関係を喜んで記述できるため、これはあまり問題にはなりません。コードは次のようになります。

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

GetTopNode()ノードのビューのみを提供するオブジェクトを返します。操作から新しいグラフを作成するために使用するオブジェクトをRemoveLeft()返します。必要に応じて、へのリンクを内部に格納する実装と、そこに渡されたインスタンスのリストを返すだけで、グラフ構造を頻繁にコピーすることを回避できます (文字列バッファーのように)。GraphOperationGraph.process()Graphgraph1GraphOperation

于 2012-07-23T17:55:19.033 に答える
0

Graph データベースと Java での操作を探している場合は、Neo4jが役立つかもしれません。完璧なグラフ DB と操作 API を探している場合、これはあなたが交渉した以上のものになる可能性があります。

グラフ ノード、関係、監査をトラバースするための非常に高度なオプションが提供されます。Neo4j は、非常に複雑な階層データを格納するために組織全体で使用されています。Neo4j によるパフォーマンスは、複雑な階層データベースのオラクル ベースの R-DB よりもはるかに優れています。

于 2012-07-30T09:54:53.410 に答える
0

私が見つけた最高のグラフ ライブラリは、Java ではなく Scala で書かれており、Java では利用できない強力な scala 機能 (抽象型など) を使用しています。

これは Graph for Scala と呼ばれ、非常に包括的ですが、Scala と Java には相互互換性があることを警告しておく必要があります (同じプロジェクトでそれらをビルドして、Scala クラスから Java クラスを呼び出すことも、その逆も可能です)。 Java で利用できないいくつかの機能に関しては、Java から Scala を呼び出すときにいくつかの問題が発生する可能性があります。

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

于 2012-07-23T10:47:09.743 に答える