1

私はJavaAPIコレクションクラスでこのコードに出くわしました。switchステートメントのように機能しますか?このイディオムはどのように呼ばれますか?

public static int indexOfSubList(List<?> source, List<?> target) {
    int sourceSize = source.size();
    int targetSize = target.size();
    int maxCandidate = sourceSize - targetSize;

    if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
        (source instanceof RandomAccess&&target instanceof RandomAccess)) {
    nextCand:
        for (int candidate = 0; candidate <= maxCandidate; candidate++) {
            for (int i=0, j=candidate; i<targetSize; i++, j++)
                if (!eq(target.get(i), source.get(j)))
                    continue nextCand;  // Element mismatch, try next cand
            return candidate;  // All elements of candidate matched target
        }
    } else {  // Iterator version of above algorithm
        ListIterator<?> si = source.listIterator();
    nextCand:
        for (int candidate = 0; candidate <= maxCandidate; candidate++) {
            ListIterator<?> ti = target.listIterator();
            for (int i=0; i<targetSize; i++) {
                if (!eq(ti.next(), si.next())) {
                    // Back up source iterator to next candidate
                    for (int j=0; j<i; j++)
                        si.previous();
                    continue nextCand;
                }
            }
            return candidate;
        }
    }
    return -1;  // No candidate matched the target
}
4

2 に答える 2

5

いいえ、それは単にラベルの付いたブレーク/コンティニューです。ここを参照してください:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

Javaでは、ラベルをブレーク/コンティニューターゲットとして使用できます。デフォルトでは、ブレーク/コンティニューは最も内側のループに影響を与えますが、ラベルを使用すると、外側のループから抜け出すことができます。

于 2013-01-04T13:56:34.833 に答える
1

とを参照していると仮定するnextCand:と、これは単に、内側のループ内から外側のcontinue nextCand;ループの次の反復に進むための方法です。

単純なものは、代わりに内側のループcontinueを継続します。

于 2013-01-04T13:58:14.827 に答える