2017-08-02 5 views
2

非常に大きなコレクションのフォルダオブジェクトを取得して外部のソースからコピーしています。それらはすべてフォルダIDと親フォルダIDを持っていますが、ツリー構造ではありません。それらを取得した後、それらを最上位ルートを持つツリーノードオブジェクトで整理します。ただし、1つまたは複数のフォルダが循環参照を作成し、どこでどのようにピンポイントをとるかを理解するのに問題があります。オブジェクトの大きなコレクションで循環オブジェクト参照を特定するにはどうすればよいですか?

循環参照を作成するときにJavaでエラーが発生することはありません。エラーは、私がjson形式にエンコードしようとすると、Webアプリケーションのクライアント側に送信する前に、stackoverflowエラーとして発生します。最初にエラーが表示されるので、どのオブジェクトがエラーの原因であるかはわかりません。

この特定の問題では、私は戦略を失っています。私の場合のように、循環オブジェクト参照を認識するための標準化された、あるいは良い方法がありますか?

+0

フォルダに複数の親がありますか?あなたはフォルダーオブジェクトについて話します。厳密に1つの親を持つ子 - 親関係またはフォルダオブジェクトの集合ですか? – Persixty

+0

厳密に1つの親。私は、エラーは私自身の精製コードであり、オブジェクト参照ではないことを知りました。 – KjetilNordin

+0

私は不思議だった。各ノードに厳密に1つの親がある場合は、どのようにオブジェクトツリーを構築しているのか分かりませんでした。すべてのルートノードを見つけてから、インスタンス化された親を持つノードを追加し続けるなどしない限り、実行するのは難しいです。ループがある場合、ツリー内に親を持たないノードで最後まで到達します。それはループを形成するからです。アルゴリズムの終わりにループがほとんど現れます。 – Persixty

答えて

3

"visited"ブールフラグをノードクラスに追加し、falseに初期化します。木をたどりなさい。指定されたノードに到着したときにフラグが真であれば、ループが検出されています。それ以外の場合は、フラグをtrueに設定し、ツリーを横断し続けます。あなたが使用するトラバーサル序列(pre = post-or-in-order)の差をなくします。

+0

もちろん...ありがとう。私は今日疲れているはずです:)。 – KjetilNordin

関連する問題