2
int MATCH_LENGTH = 0;
int FINAL_MATCH_LENGTH = 0;
int FINAL_MATCH_POS = 0;

while (window.contains(next)) {
    int MATCH_POS = window.indexOf(next);
    boolean nextMatches = true;
    while (nextMatches = true) {
        int index = window.indexOf(next);
        index++;
        int positionOfNext = fileArray.indexOf(next);
        positionOfNext++;
        MATCH_LENGTH++;
        char afterNext = fileArray.get(positionOfNext);
        char afterNextInWindow = window.get(index);
        if (afterNext != afterNextInWindow) {
            nextMatches = false;
            if (MATCH_LENGTH > FINAL_MATCH_LENGTH) {
                FINAL_MATCH_POS = MATCH_POS;
                FINAL_MATCH_LENGTH = MATCH_LENGTH;
                MATCH_LENGTH = 0;
            }
            window.remove(window.indexOf(next));
        }
    }
}

ここで無限ループに陥ります。nextMatchesブール変数が原因だと思います。ただし、whileループの条件がwhile (window.contains(next)). ただし、出現するものをnext1 つずつ削除しているため、最終的while (window.contains(next))には false を返す必要があり、whileループを中断する必要があります。ここでの私の推論には、 remove line に欠陥がある可能性がありますwindow.remove(window.indexOf(next));

それとも、私の推論の他の部分に欠陥がありますか?

4

4 に答える 4

7

あなたは古典===間違いをしました

while (nextMatches = true) 

する必要があります

while(nextMatches)

原則として、ブール値をとと比較しないtruefalseください。それはこの種の奇妙なバグにつながるだけで、私の意見ではコードが読みにくくなります。変数に適切な名前を付けると、Javaの規則ではブール値が条件付きのように聞こえます。例:isEmptyまたはisFull。このように物事は英語のように読まれます:while(isFull)

int index = window.indexof(next)特に何も変更されないので、私はあなたの論理について少し混乱しています。インデックスが再定義されます。

于 2012-12-04T05:04:49.990 に答える
4

問題はここ にありますwhile (nextMatches = true)代わりに入れてみ てください

while (nextMatches == true)
于 2012-12-04T05:05:51.920 に答える
2

問題が見つかりました。それは次の行でした: int index = window.indexOf(next);. index何度も何度も同じ数として再定義し続けたため、無限ループが発生しました。問題が解決しました!

于 2012-12-04T05:23:37.427 に答える
2
while (nextMatches == true) {

この条件は、が割り当てられているfalse場合に適用されます。nextMatchesfalse

あなたがそれを割り当てている唯一の場所falseは、次のコードブロックにあります:

if (afterNext != afterNextInWindow) {
    nextMatches = false;
    ...

whileは無限に実行されているため、コードの実行時に が割り当てられないことを意味します。つまり、nextMatchesconditionは alwaysです。falseiffalse

これは、 ; のすべての反復でwhileafterNextは常に に等しくなりafterNextInWindowます。

于 2012-12-04T05:37:06.093 に答える