【问题标题】:How to convert HashMap<String, List<String[]>> into a Tree in GWT?如何将 HashMap<String, List<String[]>> 转换为 GWT 中的树?
【发布时间】:2013-05-16 08:19:55
【问题描述】:

我得到了从数据库中提取的数据,我想将其转换为树。

数据:

妈妈 儿子 momText sonText 1 2 主层1 2 4 级别 1 级别 2 4 5 2 级 3 级 4 7 2 级 3 级 1 8 主层1 8 9 1 级 2 级


代码:

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

    }
}

运行后输出如下图,不正确:


我希望结果如下所示:

我认为我们需要在 printTree 函数中进行一些更改才能使其正常工作。

注意1:如果你不喜欢我的编码方式,你可以随意提供你自己的解决方案,但是请使用这个对象中的数据List&lt;String[]&gt; testList

注意2:不用担心文本(momText & sonText)列,只需尝试操作数字(mon&son)列,文本可以通过字符串数组轻松访问。

【问题讨论】:

    标签: gwt checkbox tree


    【解决方案1】:

    您必须返回已经解释过@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]));
    

    【讨论】:

    • 完美!!非常感谢。
    【解决方案2】:

    您可以从递归方法返回TreeItem,而不是传递Tree,如下所示

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

    【讨论】:

    • 嗨,太好了,非常感谢。有一个很小的问题,此时它显示了数字,但是你知道如何把 momText 和 sonText 带过来吗?
    • 就像我可以遍历树小部件并只搜索 monText 和 sonText,但你有更好的解决方案吗?
    • 嗯,我想有多种方法。最简单的方法是将所有testList.get(i)[1] 的代码替换为testList.get(i)[3],并将testList.get(0)[0] 的所有代码替换为testList.get(0)[2],将String parent=test[0]; 替换为String parent=test[2]; 我认为。
    • 您应该考虑使用类而不是String[],因为它会使代码更具可读性。
    • 感谢您的建议。我打算这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 2015-09-28
    • 1970-01-01
    • 2018-07-16
    • 2018-11-26
    • 2016-08-30
    • 2013-08-26
    相关资源
    最近更新 更多