2017-08-11 243 views
4

This is to save the details with recursive.如何寫尋找父母和孩子

在這裏,我想從數據庫中的細節,並用遞歸方法設置成我的豆遞歸方法。所以我可以顯示在angularUi樹合成器。我如何編寫遞歸方法來設置我的bean。

我的DB狹窄: - enter image description here

我分離了家長和孩子的用rowId.you可以訪問我的樣本screen

如: - ROWID是1父 孩子這個1是1.1 和兒童爲1.1 1.1.1這樣就會延長,,。

我保存所有的父母和孩子在一個單一的表,該表上面的影像。

會有items[]爲每個對象(行)。如果有任何孩子父母那麼孩子將在items[]陣列添加,如果發現孩子有任何的孩子那麼孩子將在該行的items[]父加入...這樣就會延長。

如: - JSON對象是: -

{ 
    "id": 1, 
    "rowId": "1", 
    "items": [ 
     { 
     "id": 10, 
     "rowId": "1.1", 
     "items": [ 
      { 
      "id": 100, 
      "rowId": "1.1.1", 
      "items": [ 
       { 
       "id": 1000, 
       "rowId": "1.1.1.1", 
       "items": [] 
       } 
      ] 
      } 
     ] 
     }, 
     { 
     "id": 11, 
     "rowId": "1.2", 
     "items": [] 
     } 
    ] 
    } 

我已經使用this answer.

保存這個數據,但同時retriving我面對的問題。問題是檢索時不會有任何父母和孩子,因爲數據將被保存在同一張表中。關係只有rowid。爲此,我需要編寫一個遞歸方法(如保存),並且需要將父項添加到父節點items[]數組中。

public class AdminComponentBean{ 

    List<MultiAdminComponent> componentListbean; 
} 

MultiAdminComponent.java:-

public class MultiAdminComponent { 

    private String componentName; 
    private String componentIdentification; 
    private String componentType; 
    private String componentState; 
    private String componentUrl; 
    private String rowId; 
    private List<MultiAdminComponent> items; 
} 

在這裏,我試圖以檢索所有的細節,並試圖增加孩子的到parent.But它應該做一個遞歸方法

List<MultiAdminComponent> componentList=BaseDAO.getAdminComponentDAOObject().getComponentDetails(); 
    if(null != componentList) { 
     for(MultiAdminComponent itemsList : componentList){ 
      if(itemsList.getRowId().length().equals() "1"){//here parent row will come 
       //by considering rowid I need to find the child of the rowId 
       //child of 1 is 1.1 
       //if 1.1 is child of 1 then I need to add that 1.1 object to `items[]` array of 1 
       //like this it should work recursve 
      } 
     } 
    } 
+0

如果你有一個父ID(assumign這就是「ROWID」的意思),應該是相當簡單的(更高的性能可能會使其更加複雜,所以我們就用簡單的堅持現在):1)獲得具有所有元素無父2),直到你沒有得到任何更多的數據做到以下幾點:一)獲得,其ROWID匹配最後加載和b)使用ROWID的附加元素加載到他們的父母元素的ID之一的所有元素映射。當你沒有獲得更多的元素時,你就完成了。 – Thomas

+0

rowid對每一行都是獨一無二的 – Murali

+0

@Thomas您能否給一些更清晰的點 – Murali

回答

3

相反遞歸的,我建議去一個額外的步驟,並存儲所有元素一個HashMap

// a map containing all elements searchable by the rowId 
HashMap<String, MultiAdminComponent> idToItem = new HashMap<>(); 
// a set containing all elements that don't have a parent (id: 1, 2, 3, etc.) 
Set<MultiAdminComponent> rootItems = new HashSet<>(); 

for (MultiAdminComponent item : componentList) { 
    // build the id->item map 
    idToItem.put(item.getRowId(), item); 
} 

for (MultiAdminComponent item : componentList) { 
    String parentId = getParentId(item.getRowId()); 
    if (parentId == null) { 
     // this item has no parent -> it is a root item 
     rootItems.add(item); 
    } else { 
     // This item has a parent -> look the parent up 
     MultiAdminComponent parent = idToItem.get(parentId); 
     parent.getItems().add(item); 
    } 
} 

// rootItems now contains all MultiAdminComponents which do not have a parent, with the correct hierarchy for all items 

getParentId可能是這樣的:

private String getParentId(String id) { 
    int lastDot = id.lastIndexOf("."); 
    if (lastDot == -1) { 
     return null; 
    } 
    return id.substring(0, lastDot); 
} 

如果你能保證componentList將通過從父母到孩子列表中,您既可以for循環結合起來。

+0

@Murali啊你是對的 –