2017-01-10 1 views
0

Je suis en train de développer un arbre GWT en utilisant le sélénium et je l'ai fait avec succès avec ce codel'amélioration du code Java pour être plus efficace

for (int i = 0; i < elem.size(); i++) { 
if (!elem.get(i).isExpanded() || !elem.get(i).isLeaf()) { 
    elem.get(i).toggleExpand(); 
} 
for (int j = 0; j < elem.get(i).getChildren().size(); j++) { 
    if (!elem.get(i).getChildren().get(j).isExpanded() || 
         !elem.get(i).getChildren().get(j).isLeaf()) { 
    elem.get(i).getChildren().get(j).toggleExpand(); 
    } 
    for (int k = 0; k < elem.get(i).getChildren().get(j).getChildren().size(); k++) { 
    if (!elem.get(i).getChildren().get(j).getChildren().get(k).isExpanded() || 
       !elem.get(i).getChildren().get(j).getChildren().get(k).isLeaf()) { 
    elem.get(i).getChildren().get(j).getChildren().get(k).toggleExpand(); 
    }..... 
    } 
} 
} 

Ma question est de savoir comment améliorer ce code ou comment mettre en méthode récursive?

+1

Cela devrait probablement continuer [codereview.se]. – shmosel

+0

Vous avez juste besoin de google 'comment utiliser récursif dans java'.et quand vous apprenez comment l'utiliser, appliquez-le à votre code et si vous avez échoué, vous pouvez poster une question et nous pouvons vous aider – Null

+0

Efficace de quelle façon: Utilisation des ressources (processeur, mémoire, etc.)? L'efficacité du développement? La maintenance? ... – Thomas

Répondre

0

Code illisible.

Essayez quelque chose comme ceci:

for (int i = 0; i < elem.size(); i++) { 
    if (!elem.get(i).isExpanded()) { 
    elem.get(i).toggleExpand(); 
    } 
    // I don't know what this method returns; no time to research for you 
    List<Element> children = elem.get(i).getChildren(); 
    for (int j = 0; j < children.size(); j++) { 
     // don't know what you call it; must be a void method of some kind 
     yourMethodName(children.get(i)); 
    } 
} 
1

Pour que le code plus lisible, il y a quelques choses que vous pourriez faire (:

résultats de la méthode de réutilisation, par exemple celle de elem.get(i) ou utiliser une pour- prolongée boucle (si elem etc. soutien):

for (int i = 0; i < elem.size(); i++) { 
    ElementClass element = elem.get(i); 
    if (!element.isExpanded() || !element.isLeaf()) { 
    element.toggleExpand(); 
    } 

    ... 
} 

de plus, puisque vous semblez faire la même chose pour l'élément et il est des enfants que vous c ould fournir une méthode par exemple:

public void expandIfNeeded(ElementClass element) { 
    if (!element.isExpanded() || !element.isLeaf()) { 
    element.toggleExpand(); 
    } 
} 

Ensuite, on boucle pourrait ressembler à ceci:

for (int i = 0; i < elem.size(); i++) { 
    ElementClass element = elem.get(i); 
    expandIfNeeded(element); 

    ... //handle children here and call the same method for those (could also be using recursion) 
} 

De plus, si vous n'avez pas besoin et l'indice ielem est itérable, vous pouvez utiliser l'extension pour:

for (ElementClass element : elem) { 
    expandIfNeeded(element); 

    ... //handle children here and call the same method for those (could also be using recursion) 
} 

Et récursion bien sûr serait le rendre plus lisible, surtout si vous ne connaissez pas la profondeur de l'arbre:

//I'm assuming "elem" is a List<ElementClass> here 
public void expandElements(List<ElementClass> elem) { 
    for (ElementClass element : elem) { 
    expandIfNeeded(element); 
    expandElements(element.getChildren()); 
    } 
} 
0

Vous pouvez basculer récursivement l'élément en utilisant le code suivant.

public static void toggleElement(Element elem){ 

     if(elem.isExpand() || elem.isLeaf()){ 
      return; 
     }else{ 
      elem.toggledExpand(); 
     } 
     List<Element> children=elem.getChildren(); 
     for (int i = 0; i < children.size(); i++) { 
      toggleElement(children.get(i)); 
     } 
    } 

Espérons que cela résoudra votre problème.