5

私は以下のようなデータ構造を持っています:

Task(id,name,subTasks[Task])

しかし問題は、subTask に別の subTask を持つ Task を含めることができることです。これは、次のように非常に深く実行できます。

Task1 Contains SubTask1

SubTask1 にはサブタスクが含まれています

これが非常に深く実行される可能性があることを理解できます。

これらのデータはデータベース テーブルから取得できます。しかし、これをJavaのデータ構造に保存するにはどうすればよいですか。深層部を知らずに for ループを使用するのは役に立たず、エレガントな方法ではありません。最適なデータ構造とデータ トラバーサルの方法は何でしょうか?

4

2 に答える 2

20

Guava TreeTraverser を使用します。

Task root = ...

/*
 * For example, you have the following tree:
 *
 *          h
 *        / | \
 *       /  e  \
 *      d       g
 *     /|\      |
 *    / | \     f
 *   a  b  c        
 */

TreeTraverser<Task> traverser = new TreeTraverser<Task>() {
    @Override
    public Iterable<Task> children(Task root) {
        return root.subTasks;
    }
};

for次に、いくつかの方法でループを使用してツリーを反復処理できます。

// Iterate in breadth-first order (hdegabcf)
for (Task task : traverser.breadthFirstTraversal(root)) { ... }

また

// Iterate in preorder (hdabcegf)
for (Task task : traverser.preOrderTraversal(root)) { ... }

また

// Iterate in postorder (abcdefgh)
for (Task task : traverser.postOrderTraversal(root)) { ... }
于 2013-09-03T12:19:42.620 に答える
3

データ構造: オブジェクト参照によって形成される暗黙のツリー。

トラバーサル: 再帰またはキュー。

ただし、各ユース ケースを個別に検討する必要があります。深さ優先トラバーサルを呼び出すものもあれば、幅優先トラバーサルを呼び出すものもあります。多くのグラフ操作が必要な場合は、グラフ ライブラリを使用して最初にツリーを構築することを検討してください。

于 2013-09-03T11:56:00.310 に答える