2016-11-28 52 views
0

我嘗試從this示例中獲取ZK樹的值。但我沒有得到所有兒童值...我的嘗試:如何在ZK中循環樹?

List<Treechildren> treeChildren = new ArrayList<>(); 
    List<Label> labelList = new ArrayList<>(); 
    List<Label> childs = new ArrayList<>(); 

    tree.getChildren().forEach(component -> { 
     if(component instanceof Treechildren){ 
      treeChildren.add((Treechildren) component); 
     } 
    }); 
    List<Treeitem> treeItems = new ArrayList<>(); 
    treeChildren.forEach(treechildren ->{ 
     treeItems.addAll(treechildren.getChildren());   
    }); 
    List<Treechildren> children = new ArrayList<>(); 

    treeItems.forEach(treeitem -> { 
     System.err.println("treeitem: " + treeitem); 
     if (treeitem.getChildren().size() > 1) {  
      treeitem.getChildren().forEach(child -> { 
       if(child instanceof Treechildren){ 
        children.add((Treechildren) child); 
       } else { 
        List<Treecell> tcList = new ArrayList<>(); 
        child.getChildren().forEach(component -> { 
         if(component instanceof Treecell) { 
          tcList.add((Treecell) component); 
         } 
        }); 
        List<Hlayout> hlList = new ArrayList<>(); 
        tcList.forEach(treecell ->{ 
         System.err.println("treecell" + treecell); 
         hlList.addAll(treecell.getChildren()); 
        }); 

        hlList.forEach(hlayout -> { 
         childs.addAll(hlayout.getChildren()); 
        }); 

       } 
      }); 
     }else { 

      List<Treerow> tr = new ArrayList<>(); 
      treeitem.getChildren().forEach(component -> { 
       if (component instanceof Treerow) { 
        tr.add((Treerow) component); 
       } else { 
       } 

      }); 
      List<Treecell> TC = new ArrayList<>(); 
      tr.forEach(treerow -> { 
       TC.addAll(treerow.getChildren()); 
      }); 

      List<Hlayout> HL = new ArrayList<>(); 
      TC.forEach(treecell -> { 
       HL.addAll(treecell.getChildren()); 
      }); 

      HL.forEach(hlayout -> labelList.addAll(hlayout.getChildren())); 
     } 
    }); 

    labelList.forEach(label -> System.err.println("label: " + label.getValue())); 
    childs.forEach(label -> System.err.println("childs: " + label.getValue())); 
} 

但我沒有得到整個樹的標籤....目的是樹保存到數據庫時,我按下提交按鈕。

回答

1

既然你沒有發佈你的樹,我只能猜測它的外觀。但我試圖至少了解你的代碼並發現了一個潛在的bug:在第21行處理樹節點有子節點的情況。您將Treechildren添加到children,但不要對它做任何事情。所以你循環將停止在第一級。

首先,我會建議使用樹木的特殊方法及其組件:)getTreechildren(

  • Treeitem:)getTree(),getTreerow()和getTreechildren(
    • Treerow:getTree()和getLinkedTreechildren()

    這些幫助您擺脫所有的鑄造和instanceof檢查。此外,還可以調用getChildren()時註明兒童的類型:

    List<Treecell> cells = row.<Treecell> getChildren() 
    

    現在你不必投,但要小心,所有的孩子都是同一類型的。

    最後,我重構你的代碼來理解它:

    // Find all items in the tree, level by level 
    List<Treeitem> items = new ArrayList<>(tree.getTreechildren().getChildren()); 
    List<Treeitem> itemsTemp = new ArrayList<>(tree.getTreechildren().getChildren()); 
    while (!itemsTemp.isEmpty()) 
    { 
        Treeitem nextChild = itemsTemp.remove(0); 
        if (nextChild.getTreechildren() != null) 
        { 
         items.addAll(nextChild.getTreechildren().getChildren()); 
         itemsTemp.addAll(nextChild.getTreechildren().getChildren()); 
        } 
    } 
    
    // convert item -> row -> cells -> hlayouts -> children 
    List<Component> children = items.stream() 
               .map(Treeitem::getTreerow) 
               .filter(Objects::nonNull) 
               .flatMap(row -> row.<Treecell> getChildren().stream()) 
               .flatMap(cell -> cell.<Hlayout> getChildren().stream()) 
               .flatMap(hlayout -> hlayout.getChildren().stream()) 
               .collect(Collectors.toList()); 
    
        // // without streams 
        // List<Component> children = new ArrayList<>(); 
        // for (Treeitem item : items) 
        // { 
        //  if (item.getTreerow() != null) 
        //  { 
        //   for (Treecell cell : item.getTreerow().<Treecell> getChildren()) 
        //   { 
        //    for (Hlayout hlayout : cell.<Hlayout> getChildren()) 
        //    { 
        //     children.addAll(hlayout.getChildren()); 
        //    } 
        //   } 
        //  } 
        // } 
    

    你可以看到,在while循環,我看着樹的孩子在第一層,然後在自己的孩子,那些孩子們的兒童等等。然後我使用上面提到的方法來查找每個樹節點的組件。

    再次,我不知道你的樹是怎麼樣的,所以我不知道這是否適合你。也許你可以發佈一個小例子。