3

私はこのようなノードを持つツリーを持っています:

-Root
|-Node 1
|-Node 2
  |-Node 2.1

これらのノードの1つは、1つのクラスによって表されます

class Node {
    Integer id;
    String name;
    String route;
}

表示されたノードのインスタンスは次のように保存されます

{id: 1, name: "Root", route:"1"}
{id: 2, name: "Node 1", route: "1/2"}
{id: 3, name: "Node 2", route: "1/3"}
{id: 4, name: "Node 2.1", route: "1/3/4"}

問題は次のとおりです。ノードのリストからツリーの状態を表すjsonにどのように取得できますか。例:

[{
"property": {
    "name": "Root",
    "id": "1",
    "route": "1"
},
"children": [{
    "property": {
        "name": "Node 1",
        "id": "2",
        "route": "1/2"
    },
    "property": {
        "name": "Node 2",
        "id": "3",
        "route": "1/3"
    },
    "children": [{
        "property": {
            "name": "Node 3",
            "id": "4",
            "route": "1/3/4"
        }
    }]
}]
}]

私はまさにこのjson構造が必要です

これらはすべてJavaで行う必要があります。ノードのリストを繰り返し処理してjsonオブジェクトを作成しようとしましたが、ノードのルートフィールドからjson構造を取得するのに問題があります

jsonライブラリを使用できますノードクラスは変更できません

編集:このフォーマットはかなり奇妙ですが、必要です。「プロパティ」はノードです。「プロパティ」に子がある場合、それらはプロパティに配置されません。プロパティの後にエーテルが配置されます...あまり意味がないと思いますが、変更できません。

4

2 に答える 2

4

次のようなアルゴリズムを試すことができます。

public JSONObject toJSON(Node node, List<Node> others) {
    JSONObject json = new JSONObject();
    json.put("id", node.id); // and so on
    ...
    List children = new ArrayList<JSONObject>();
    for(Node subnode : others) {
        if(isChildOf(subnode, node)) {
            others.remove(subnode);
            children.add(toJSON(subnode, others));
        }
    }
    json.put("children", children);
    return json;
}

リストを反復処理するときにリストを変更し、再帰呼び出しもリストを反復処理します。これは毛むくじゃらかもしれませんが、試してみてください。それが失敗した場合、それを回避する方法があります。

isChildOf()欠けている部分です。これは、subnode.pathがnode.idで始まるかどうかを確認するための、かなり基本的な文字列操作です。

編集:実際、これはあなたの質問と同じ構造を作成しません。しかし、私はあなたの質問の構造をあまり理解することができません。ただし、このアルゴリズムに非常によく似たものを使用すると、必要なものが生成されます。原則は健全です。

于 2012-08-21T15:50:56.293 に答える
0

route適切なグラフ表現を作成するには、属性を解析する必要があります。

于 2012-08-21T15:22:40.460 に答える