2017-02-14 6 views
2

Javaのデータベースからツリーを移動したい。データベースツリーto java

最初に私がDBからResultSetを取得:

String selectTree = "select id, id_parent, text from tree ";   
ResultSet resultSet = statement.executeQuery(selectTree); 

resultSet.last(); 
sizeOfSelect = resultSet.getRow(); 
resultSet.beforeFirst(); 

list = new ArrayList<Node>(sizeOfSelect); 

while(resultSet.next()) { 
    list.add(new Node(resultSet.getInt(1), 
      resultSet.getInt(2), 
      resultSet.getString(3))); 
} 

今、私はノードの配列を持っている:

class Node<T> { 
    private int id; 
    private int parent_id; 
    private String text; 

    Node(int _id, int _parentId, String _text) { 
     this.id = _id; 
     this.parent_id = _parentId; 
     this.text = _text; 
    } 

//getters & setters here 

私はJavaで同じツリーを入手するにはどうすればよいですか? 考えてみてください。

私は解決策を進めました。 私は、このようにマップにRawNodeの配列を回す:メソッドdependsIdは()である

for(RawNode rawNode : tmpList) { 
     tmpMap.put(rawNode.getId(), dependsId(rawNode.getId())); 
} 

は:

private List<RawNode> dependsId(int id) { 
    List<RawNode> tmpDependList = new ArrayList<>(); 
    for(RawNode rawNode : tmpList) { 
     if(rawNode.getParentId() == id) { 
      tmpDependList.add(rawNode); 
     } 
    } 
    return tmpList; 
} 

私は次に何をすべきか?親と子を持つNodeの配列でこのマップをどのように変換するのですか?

class RawNode { 
    private int id; 
    private int parent_id; 
    private String text; 

[ヒント:

+0

を持っている願っています今は "十分に答えた"?もしそうなら、それはあなたと一緒に働くのが素敵でした。しかし、言ったように:毎回これが起こるとは思わない。結局のところ、学習プログラミングは**主に**自分で多くのことをやっていることです。他の人の経験に頼る方がより便利で効率的です。あなたがパズルを解く方法を理解するまで、あなたは壁に衝突したいと思っています。それはあなたの将来の仕事のために幸運を祈っています。 – GhostCat

答えて

2

は今、あなたの「生」のノードは、次のようになり、私はそのクラスの宣言と改名しました。 部分を削除しました。実際には、はありません。はこのクラスでは一般的ではありません。少なくともあなたが表示しているものから]

そして理想的には、正確にはの各IDのノードオブジェクトがあることを意味します。言い換えると;時間の経過とともに、次のようなオブジェクトを作成しました。

RawNode rootWithoutParent = new Node(0, -1, "root"); 
RawNode firstChildParent = new Node(1, 0, "root"); 

これらのオブジェクトはすべてアレイ/リストにあります。今、あなたは「本当の」ノードに、それらのRawNodesを変換でき、その1は、次のようになります。

class Node { 
    private int id; 
    private Node parent; 
    private List<Node> children = new ArrayList<>(); 
    private String text; 

翻訳は、複数の反復で行うことができます。何が不足している

List<Node> nodes = new ArrayList<>(); 
Map<Node, RawNode> rawNodesByNode = new HashMap<>(); 
Map<Integer, Node> nodesById = new HashMap<>(); 
for(RawNode rawNode : tmpList) { 
    Node node = new Node(); 
    node.setId(rawNode.getId()); 
    node.setText(rawNode.getText()); 
    rawNodesByNode.put(node, rawNode); 
    nodesById.put(rawNode.getId(), node); 
} 

まず、あなたがRawNodeにつき1つのノード作成(およびそれ以降のために、我々はマップ内の特定の情報を覚えていますか)?

まず、子から親への「リンク」。

for(Node node : nodes) { 
    Node parent = node.getParent(); // should be != null by now 
    parent.addChild(node); 
} 

void addChild(Node node) { 
    children.add(node); 
} 

(注意してください:

for(Node node : nodes) { 
    RawNode raw = rawNodesByNode.get(node); 
    int parentId = raw.getParentId(); 
    Node parent = nodesById.get(parentId); 
    node.setParent(parent); 
} 

セカンド( "オプション")の親からのすべてのチャイルズへの "リンク" の子供たちのリストを直接作成されますNode.new()呼び出しを行いますが、その時点では空です。それを超えて:私は自分のコードをコンパイラに入れませんでした。それはあなたを得るために "擬似コード"として意味されています。必要なステップについていくつかの洞察を与えてください。親がない「ルートノード」のようなケースを扱う特別なチェックが必要な状況では、「バグ」の可能性もあります。言い換えれば:&は私のコードを貼り付けてください:と思っているものを理解してそこからとすると)。

希望はあなたに行くための十分なアイデアを与えます。そして注意してください:これはすべて「仕事」です。関係する「ロケット科学」はありません。したがって、重要な部分はとなり、あなたが何をしようとしているのかを理解することです。それでは、もう一つの質問をする衝動に抵抗してください。代わりに:作業を開始します。

+0

あなたのコメントをお読みいただけますか?ヒント:あなたは**決して**質問に10文字以上のコードを入れません。そして私はすでにあなたに言った:これはチュートリアルサービスではなく、ソリューションのすべての必要なステップを通してあなたを歩いています。 – GhostCat

+0

私はあなたの変更を調べるように私に思い出させるために明日の早い時期に私にコメントをしたいと思うかもしれません...しかし、言ったように:あなたの進歩を本当に妨げている正確な質問を見てください。 – GhostCat

+0

私が得たものを見てください。 – Krabs

0

あなたがツリーを望むなら、あなたのノードには他のノード(少なくとも親のための)へのいくつかのリンクが全くないので、ノードのparent_idNode parentNodeに置き換え、データベースのparent_idに従って追加してくださいああ

list.add(new Node(resultSet.getInt(1), 
      someMap.get(resultSet.getInt(2)), 
      resultSet.getString(3))); 

、およびその親IDがnullでないかどうかをチェックすることを忘れないでください:それらすべては、各trhough反復してはやるときに、整数IDですMap<Integer, Node> someMap、によってマッピングされた、最初にマップします。

私は頻繁に結果セットを使用しませんが、そこからいくつかの一時的なリストに移動する方が良いと思います。それがあるべきよう

本当に申し訳ありませんが、すべてのものを書くための時間を持っていない、しかし、私はあなたの質問であることを...私は指標としての私の最後のコメントのためにその1を取るあなたは私の考え