While(flag) 무한 루프를 사용할 때의 주의

18583 단어 자바

소개



이것은 내가 무한 루프를 사용할 때 실패하고 앞으로 조심하려고 할 것입니다.
초보자로 같은 함정에 떨어진 사람의 도움이 되면 무엇보다이다.
그리고 이것은 자신의 비망록이기도 하다.

소개



여기서 문제가되는 것은 arraySort () 메소드에서 while의 무한 루프입니다.
While의 무한 루프는 일이 끝나면 flag=false;로 하여 루프를 멈추는 것이지만, 이 flag=false;의 위치에 대해 논하고 싶다.

이것을 나는 시작해, 18행째에 넣고 있었다.
그렇다면 결과는
{31,29,45,77,84,96}이므로 정렬이 완료되지 않았습니다.
그래서 정렬의 모습을 내보내 보았다.


이것을 보면, 루프는 조도 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;
    }
}

좋은 웹페이지 즐겨찾기