LoginSignup
0
0

More than 1 year has passed since last update.

While(flag) 無限ループを使う時の注意

Last updated at Posted at 2021-08-05

はじめに

これは、私が無限ループを使うときに失敗して今後、注意しようと思うことである。
初心者の方で同じ落とし穴に落ちた人の役に立てば何よりである。
そして、これは自分の備忘録でもある。

はじめに

ここで問題になるのは、arraySort()メソッドにおけるwhileの無限ループである。
Whileの無限ループは仕事が終わったらflag=false;にしてループを止めるのであるが、このflag=false;の位置について論じたい。

これを私ははじめ、18行目に入れていた。
そしたら、結果は
{31,29,45,77,84,96}となり並び替えが完了していない。
そこで、並び替えの様子を書き出してみた。
スクリーンショット 2021-08-05 8.51.35.png

これをみると、ループは調度2回、回ったところで止まっている。
2巡目の最後は、{84、96}という数字で入れ替わりが発生しない。そこで、ここで、flagがfalseになり3巡目に行かなくなっている。
当たり前であるが、flag=false;はforループの外側に出すという癖をつけようと思う。

該当するソースコード

public class Main5_7 {//1
    public static void main(String[] args){//2
        int[] arrays1= {96,45,31,29,84,77};

        display(arrays1, false);
        arraySort(arrays1, true);
        display(arrays1, true);
        arraySort(arrays1, false);
        display(arrays1, true);
    }
    public static void arraySort(int[] array, boolean orderType) {
        //3
        boolean a = true;
        if(orderType) {//4
            while(a) {
                a=false;  //16行目
                for(int i=0 ; i<array.length-1 ; i++) {
                    // a=false; //なぜ、ここにあったらいけないのかわかりません。//18行目
                    //最後に入れ替えがないとだとfalseになる。
                    if(array[i]>array[i+1]) {
                        a=true;
                        change(array, i, i+1);
                    }
                }
            }

        } else {
            while(a) {
                a=false;
                for(int i=0 ; i<array.length-1 ; i++) {
                    if(array[i]<array[i+1]) {
                        a=true;
                        change(array, i, i+1);
                    }
                }
            }
        }//4
    }//3

    public static void display(int[] array, boolean isSorted) {
        if(isSorted) {
            System.out.println("配列は整えられています。");
        } else {
            System.out.println("配列は整えられていません。");
        }
        for(int value : array) {
            System.out.print(value + ",");
        }//3
    }

    public static void change(int[] array,int i, int j) {
        int temp;
        temp = array[i];
        array[i] = array[j];
        array[j]= temp;
    }
}

以下は改良中のコードの備忘録です。

配列は整えられていません。
96,45,31,29,84,77,
配列は整えられていません。
96,45,31,29,84,77,
配列は整えられています。
31,29,45,77,84,96,
配列は整えられています。
96,84,77,45,31,29,

改良中のコード

public class Main5_7_1 {//1
    public static void main(String[] args){//2
        int[] arrays1= {96,45,31,29,84,77};

        display(arrays1, false);
        arraySort(arrays1, true);
        display(arrays1, true);
        arraySort(arrays1, false);
        display(arrays1, true);
    }
    public static void arraySort(int[] array, boolean orderType) {
        //3

        if(orderType) {//4
            while(true) {
                for(int i=0 ; i<array.length-1 ; i++) {
                    if(array[i]>array[i+1]) {
                        change(array, i, i+1);
                    } else {
                        break;
                    }
                }
            }

        } else {
            while(true) {
                for(int i=0 ; i<array.length-1 ; i++) {
                    if(array[i]<array[i+1]) {
                        change(array, i, i+1);
                    } else {

                    }
                }
            }
        }//4
    }//3

    public static void display(int[] array, boolean isSorted) {
        if(isSorted) {
            System.out.println("配列は整えられています。");
        } else {
            System.out.println("配列は整えられていません。");
        }
        for(int value : array) {
            System.out.print(value + ",");
        }//3
        System.out.println();
    }

    public static void change(int[] array,int i, int j) {
        int temp;
        temp = array[i];
        array[i] = array[j];
        array[j]= temp;
    }
}
0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0