2016-11-28 12 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

あなたはあなたのツリーを投稿していないので、私はそれがどのように見えるかしか推測できません。しかし、私はあなたのコードを少なくとも理解しようとしましたが、潜在的なバグを発見しました。行21では、ツリーノードにサブノードがある場合を扱います。あなたはchildrenにTreechildrenを追加しますが、何もしないでください。だから、ループは最初のレベルで停止します。

まず第一に、私は木のための特別な方法を使用することをお勧めしますとそのコンポーネント:

  • ツリー:getTreechildren()
  • ツリー項目:getTree()、getTreerow()とgetTreechildren()
  • Treerow:getTree()およびgetLinkedTreechildren()

これらは、すべてのキャストおよびインスタンスチェックを取り除くのに役立ちます。 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ループでは、私はそれらの子供で、その後、子供たちに、最初のレベルのツリーの子供たちを見ていることがわかります子供たち、など。次に、上記の方法を使用して、各ツリーノードのコンポーネントを見つけました。

また、私はあなたのツリーがどのように見えるかわからないので、これがあなたのために働くかどうかわかりません。たぶんあなたは小さな例を投稿することができます。

関連する問題