2014-11-05 63 views
0

我该如何重构我的代码来删除标签以及它的需求? 我知道带标签的循环是“禁止”的。但我无法找到一种方法来重写没有标签的情况。如何重构代码以避免Java循环中的标签?

任何想法?感谢

private List<myList> sortLinks(SegmentType s, Set<myList> LinkSet) { 
     List<myList> LinkList = new LinkedList<myList>(); 

     String dep = s.getDep().toString(); 
     mainLoop: for (int index = 0; !LinkSet.isEmpty(); index++) { 

      for (Iterator<myList> iterator = LinkSet.iterator(); iterator.hasNext();) { 
       myList link = iterator.next(); 
       if (link.getLegDep().toString().equals(dep)) { 
        iterator.remove(); 
        link.setLine(s.getLineCode()); 
        link.setNb(s.getNb()); 
        link.setSuff(s.getSuff()); 
        link.setIndex(index); 
        linkList.add(link); 

        dep = link.getDest().toString(); 
        continue mainLoop; 
       } 
      } 

      return Collections.emptyList(); 
     } 
     return linkList; 
    } 
+0

试试[代码审查StackExchange(http://codereview.stackexchange.com/) - 他们可能是提供咨询的更有利的地位。 – jbutler483 2014-11-05 16:28:43

+0

好的,完成了。 – hacks4life 2014-11-05 16:33:20

回答

2

您可能需要boolean。我不完全理解你的代码试图完成什么,但它看起来像内循环试图找到某种“依赖”?如果是这样的话,我会命名为booleandepedencyFound;如果我真的猜错了,你可以称之为别的东西。无论如何,这样的事情:

private List<myList> sortLinks(SegmentType s, Set<myList> LinkSet) { 
    List<myList> LinkList = new LinkedList<myList>(); 

    String dep = s.getDep().toString(); 
    for (int index = 0; !LinkSet.isEmpty(); index++) { 

     boolean dependencyFound = false; 
     for (Iterator<myList> iterator = LinkSet.iterator(); iterator.hasNext();) { 
      myList link = iterator.next(); 
      if (link.getLegDep().toString().equals(dep)) { 
       iterator.remove(); 
       link.setLine(s.getLineCode()); 
       link.setNb(s.getNb()); 
       link.setSuff(s.getSuff()); 
       link.setIndex(index); 
       linkList.add(link); 

       dep = link.getDest().toString(); 
       dependencyFound = true; 
       break; 
      } 
     } 

     if (!dependencyFound) { 
      return Collections.emptyList(); 
     } 
    } 
    return linkList; 
} 

如果您命名变量的权利,它会让它很清楚发生了什么事情。在这里,你寻找一个依赖;如果你找不到一个,你会返回一个空的列表;如果你这样做,那么你通过主循环再次迭代。

P.S.一旦你这样做了,那么把整个内部循环转移到一个返回boolean的方法可能相当容易,尽管它看起来也需要返回String,新值为dep。但是,如果你找到了一种方法来做到这一点,它将会更加清理你的代码。

+0

嗨ajb,谢谢你的回答。我不认为我能够让该方法返回内部循环的布尔值,尤其是因为您正在讨论返回一个String。任何建议来清除我的想法? – hacks4life 2014-11-05 16:50:17

+0

一种可能性:将内循环提取到返回'myList'的方法中。如果找到一个,它返回你找到的'myList'('link')。如果找不到,则返回'null'。然后,而不是使用'boolean',外层循环会说'if(foundLink == null)返回Collections.emptyList();',如果不是'null',那么外层循环会根据'foundLink'。只是一些可能的想法。较短的方法往往会提高可读性,但如果您不得不使事情复杂化太多,则会带来收益递减的问题。这是一个判断呼吁。 – ajb 2014-11-05 17:09:06

+0

关于布尔值,我想知道是否需要在我的'String dep = s.getDep()。toString();'行之后设置它,或者在'for'循环中像你一样设置它。 – hacks4life 2014-11-06 08:52:13

-1

由于continue是在内部循环,简单地使用break应该开始主循环的下一次迭代的结束。

+0

那我该如何避免使用标签呢? – hacks4life 2014-11-05 16:34:20

+0

使用break关键字时,不需要标签。它将跳出内部循环,将控制权返回给外部循环(因为它在迭代结束时将继续执行外部循环的下一次迭代,而没有进一步的指令)。 – eurythmia 2014-11-05 16:36:45

+2

这个答案是错误的。使用'break'将退出内部循环,并在内部循环后面跳转到语句,即返回Collections.emptyList()'。 – ajb 2014-11-05 16:39:09

1

其实eurythmia答案是正确的。 您可以使用布尔值继续像这样:

private List<myList> sortLinks(SegmentType s, Set<myList> LinkSet) { 
    List<myList> LinkList = new LinkedList<myList>(); 

    String dep = s.getDep().toString(); 
    for (int index = 0; !LinkSet.isEmpty(); index++) { 

     for (Iterator<myList> iterator = LinkSet.iterator(); iterator.hasNext();) { 
      myList link = iterator.next(); 
      boolean toContinue = false; 
      if (link.getLegDep().toString().equals(dep)) { 
       iterator.remove(); 
       link.setLine(s.getLineCode()); 
       link.setNb(s.getNb()); 
       link.setSuff(s.getSuff()); 
       link.setIndex(index); 
       linkList.add(link); 

       dep = link.getDest().toString(); 
       toContinue = true; 
       break; // this breaks inner loop 
      } 
     } 
     if(toContinue) { 
      continue; // this continues main loop without executing the 'return' 
     } 
     return Collections.emptyList(); 
    } 
    return linkList; 
}