0

コンパイルに問題はありませんが、while ループの有無に関係なく、結果は同じです。while ループが含まれている理由がわかりません。ところで、これは Java SE チュートリアルの単なるサンプル プログラムです。

public class ContinueWithLabelDemo {

    public static void main(String[] args) {

        String searchMe = "Look for a substring in me";
        String substring = "sub";
        boolean foundIt = false;

        int max = searchMe.length() - substring.length();

        test:
        for (int i = 0; i <= max; i++) {
            int n = substring.length();
            int j = i;
            int k = 0;

            while (n-- != 0) { // WTF???
                if (searchMe.charAt(j++) != substring.charAt(k++)) {
                    continue test;
                }
            }

            foundIt = true;
            break test;
        }
        System.out.println(foundIt ? "Found it" : "Didn't find it");
    }
}
4

1 に答える 1

4

あなたはあなたを置き換えることができます

while (n-- != 0) { // WTF???

System.out.println("outside loop");
while (n-- != 0) { // WTF???
    System.out.println("inside loop: comparing "
            + searchMe.charAt(j) + ":" + substring.charAt(k));

この例がどのように機能するかを確認します。以下、ちょっと説明。


このコードは文字列を検索しsubstringていsearchMeます。次の例を見てください。

Look for a substring in me
^
sub

の位置 0 の文字を比較するsearchMesubstring、それらが同じではないことに気付くでしょうL!=sしたがって、一致する残りの文字をスキップして次の位置に移動できます (これが の目的ですcontinue test;)

Look for a substring in me
 ^
 sub

それでは、次の文字を の最初の文字と の最初の文字と比較してみsearchMeますsubstring。今回はo!=を取得sするので、部分文字列がこの場所から始まることはありません。続けましょう。

いくつかの比較の後、最終的に有望な場所を見つけました

Look for a substring in me
           ^
           sub

の最初の文字は( == )substringの現在の文字と同じであるため、まだループからジャンプせず、次の文字をチェックしようとします。そして、私たちは別の成功を収めましたsearchMesswhile

Look for a substring in me
            ^
           sub

u==であるため、次のステップで発生する可能性があるu全体を反復処理するまでループを続行します。substring

Look for a substring in me
             ^
           sub

そして今回は と比較bしましbた。それらは等しく、チェックする文字がこれ以上ないため、tosubstringの値を設定して for ループにブレーキをかけることができます。foundIttruetest

そして、それは終わりです。


コードから while を削除すると、プログラムをsubstringチェックした後、の最初の文字と一致する最初の文字が見つかるとすぐに肯定的な応答が得られます。Look for assubstrings

ここではループを使用して全体を反復処理しますがsubstring、対応する文字の一致に失敗した場合にのみ、1 つ先の場所を検索します。この内側のループを無視して、データ全体を反復するだけであればaabaaab文字列で検索する場合のように、いくつかの肯定的な結果を無視できます。見てみる

aaab
aab
^^

^一致しますが、それらの後に一致する必要があり、a失敗bします。内側の while ループがなければ、失敗した最後のチェック位置から別のマッチを開始する可能性があります。

aaab
  aab
  ^

今回も部分文字列の一致が見つからなかったため、a*aab*一部をスキップしました。

于 2013-08-19T03:05:14.383 に答える