如何重构代码以避免Java循环中的标签?

时间:2014-11-05 16:26:37

标签: java loops refactoring label

如何重构我的代码以删除标签及其需要? 我知道带标签的循环是"禁止"。但是我找不到一种方法来重写这个没有标签的方法。

有什么想法吗?感谢

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

3 个答案:

答案 0 :(得分:2)

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

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的方法可能相当容易,尽管看起来它还需要返回{{1使用String的新值。但是如果你找到了这样做的方法,它将会更清理你的代码。

答案 1 :(得分: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;
}

答案 2 :(得分:-1)

因为continue位于内循环的末尾,所以只需使用break即可开始主循环的下一次迭代。