2013-05-16 62 views
1

我從數據庫中得到了這個數據&我想將它轉換成樹。如何將HashMap <String,列表<String[]>>轉換爲GWT中的Tree?

DATA:

 
mom son momText sonText 
1 2 Main Level1 
2 4 Level1 Level2 
4 5 Level2 Level3 
4 7 Level2 Level3 
1 8 Main Level1 
8 9 Level1 Level2 


CODE:

List<String[]> testList=new ArrayList<String[]>();; 
String[] test1={"1","2","Main","Level1"}; 
String[] test2={"2","4","Level1","Level2"}; 
String[] test3={"4","5","Level2","Level3"}; 
String[] test4={"4","7","Level2","Level3"}; 
String[] test5={"1","8","Main","Level1"}; 
String[] test6={"8","9","Level1","Level2"}; 

testList.add(test1); 
testList.add(test2); 
testList.add(test3); 
testList.add(test4); 
testList.add(test5); 
testList.add(test6); 

HashMap<String, List<String[]>> myHashMap = new HashMap<String, List<String[]>>(); 
for(int i=0; i<testList.size(); i++){ 
    String[] test=testList.get(i); 
    String parent=test[0]; 
    List<String[]> children = myHashMap.get(parent); 
    if (children == null){ 
     children = new ArrayList<String[]>(); 
     myHashMap.put(parent,children);      
    } 
    children.add(test); 
} 
Tree myTree=new Tree(); 
String node=testList.get(0)[0]; 
printTree(node, myTree, myHashMap); 

我也有叫 「printTree」

public void printTree(String node, Tree myTree, HashMap<String, List<String[]>> myHashMap){ 
    CheckBox nodeCheckBox=new CheckBox(node); 
    TreeItem root = new TreeItem(nodeCheckBox); 
    myTree.addItem(root); 

    if(myHashMap.containsKey(node)){ 
     List<String[]> testList=myHashMap.get(node); 

     for(int i=0; i<testList.size(); i++){ 
      String nextNode=testList.get(i)[1]; 
      printTree(nextNode, myTree, myHashMap); 
     } 

    } 
} 

的方法運行後,輸出這個樣子的是不正確:
enter image description here


我想要的結果是這樣的:
enter image description here

我認爲,我們需要改變一點點在printTree功能,使其工作。注1:如果您不喜歡我編碼的方式,您可以隨意提供您自己的解決方案,但請使用此對象中的數據List<String[]> testList。注意2:你不需要擔心文本(momText & sonText)列,但只是試圖操縱數字(mon & son)列,文本可以很容易地通過字符串數組訪問。

回答

2

您必須返回已經說明@cyon的樹項目,然後在文本的方法中傳遞顯示文本:

public TreeItem printTree(String node, HashMap<String, List<String[]>> myHashMap,String displayText){ 
      CheckBox nodeCheckBox=new CheckBox(displayText); 
       TreeItem root = new TreeItem(nodeCheckBox); 
       root.setState(true); 
       if(myHashMap.containsKey(node)){ 
        List<String[]> testList=myHashMap.get(node); 

        for(int i=0; i<testList.size(); i++){ 
        String nextNode=testList.get(i)[1]; 
        TreeItem child = printTree(nextNode, myHashMap,testList.get(i)[3]); 
        root.addItem(child); 
        root.setState(true); 
        } 

       } 
       return root; 
     } 

,並致電法像

Tree myTree=new Tree(); 
    String node=testList.get(0)[0]; 
    myTree.addItem(printTree(node, myHashMap,testList.get(0)[2])); 
+0

完美!非常感謝你。 – Tum

+0

歡迎您.. :) – iMBMT

1

而是經過你身邊的Tree可以從遞歸方法返回TreeItem如下

public TreeItem createTree(String node, HashMap<String, List<String[]>> myHashMap){ 
    CheckBox nodeCheckBox=new CheckBox(node); 
    TreeItem root = new TreeItem(nodeCheckBox); 

    if(myHashMap.containsKey(node)){ 
     List<String[]> testList=myHashMap.get(node); 

     for(int i=0; i<testList.size(); i++){ 
     String nextNode=testList.get(i)[1]; 
     TreeItem child = createTree(nextNode, myHashMap); 
     root.addItem(child); 
     } 

    } 
    return root; 
} 

然後在代碼的主要位你只需要添加的根樹

Tree myTree=new Tree(); 
String node=testList.get(0)[0]; 
myTree.addItem(createTree(node, myHashMap)); 
+0

嗨,偉大的,非常感謝你。有一個非常小的問題,這一次顯示數字後,但你知道如何把媽媽文字和兒子文字? – Tum

+0

就像我可以循環遍歷樹小部件&只是搜索monText&sonText,但你有更好的解決方案來解決它嗎? – Tum

+0

嗯,我想有多種方法。最簡單的方法是用'testList.get(i)[3]'替換所有代碼,並將'testList.get(i)[1]'替換爲'testList.get(0)[0]' ';''parent parent = test [2];''我認爲,用'testList.get(0)[2]'和'String parent = test [0];' – cyon

相關問題