2017-02-14 44 views
2

我想從java中的數據庫中移動一棵樹。數據庫樹到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的數組中的地圖這樣的:

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

Where方法dependsId()是:

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

我應該怎麼做?如何通過父節點和子節點將節點數組中的此映射轉換成圖?

+0

我採取+1我的指示最後評論...您的問題是現在「足夠回答」了?如果是這樣 - 與你合作很愉快;但正如所說:不要指望每次都會發生這種情況。最後,學習編程主要是**自己做很多事情。依靠別人的經驗似乎更加方便和高效;但重點是:你*想要*不斷地撞到牆上,直到你想出如何解決這個難題。話雖如此,祝你今後工作順利。 – GhostCat

回答

2

現在,你的 「原始」 的節點是這樣的:

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

[提示:我改名爲該類聲明;並刪除<T>部分,這是沒有任何意義的事實,因爲你有沒有該類通用;至少從你展示的]

理想情況下,這將意味着有正好一個節點對象爲每個ID。換一種說法;隨着時間的推移,您創建瞭如下對象:

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

而且您將所有這些對象都放在數組/列表中。現在,你可以改變這些RawNodes,進入「真正的」 節點,和一個看起來是這樣:

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

翻譯可以在多次反覆進行。

首先,將創建每RawNode一個節點(及以後,我們記得在地圖的具體信息):

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); 
} 

缺少什麼?

首先,從孩子到他們的父母的「聯繫」。

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

二( 「可選」)中的 「鏈接」 從父母的所有孩子的:

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

有:

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

(請注意:孩子列表中直接創建時你做一個Node.new()調用;但在那個時候,它是空的。除此之外:我沒有把我的代碼放到編譯器中;它的意思是「僞代碼」,讓你走;並對所需步驟提供一些見解。 「bug」也有一定的可能性 - 需要特殊檢查才能處理像沒有父級的「根節點」這樣的情況;換句話說:不要只是複製&粘貼我的代碼:瞭解它是什麼應該做和從那裏工作)。

希望能給你足夠的想法讓你走。請注意:所有這些只是「工作」;沒有涉及「火箭科學」;所以基本部分是現在搞,瞭解你要做什麼。所以要抵制要求另一個問題的衝動;相反:開始工作

+0

你能閱讀你的評論嗎?提示:你從來沒有**將超過10個字符的代碼放入問題中。我已經告訴過你了:如果我們通過一個解決方案的所有必要步驟,我們就不會通過導師服務。 – GhostCat

+0

我明白了......你可能想在明天早些時候給我發表評論,提醒我看看你的改變......但正如所說:仔細看看你離我多遠;然後看看確切的問題確實阻礙了你的進步。 – GhostCat

+0

請看,我得到了什麼 – Krabs

0

那麼,如果你想要樹,你的節點肯定缺少一些到其他節點的鏈接(至少對於父節點),我建議將node中的parent_id替換爲Node parentNode,並根據數據庫中的parent_id進行設置,例如add他們都在映射首先,通過Map<Integer, Node> someMap,其中integer是ID映射,那麼當迭代trhough每做:

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

哦,不要忘記檢查如果父ID不爲空。

我並不經常使用結果集,但我想最好將它們從那裏移動到某個臨時列表中。

真的很抱歉,沒有時間來寫一切理所應當的,但我希望你有我的想法