はじめに
これは、私が無限ループを使うときに失敗して今後、注意しようと思うことである。
初心者の方で同じ落とし穴に落ちた人の役に立てば何よりである。
そして、これは自分の備忘録でもある。
はじめに
ここで問題になるのは、arraySort()メソッドにおけるwhileの無限ループである。
Whileの無限ループは仕事が終わったらflag=false;にしてループを止めるのであるが、このflag=false;の位置について論じたい。
これを私ははじめ、18行目に入れていた。
そしたら、結果は
{31,29,45,77,84,96}となり並び替えが完了していない。
そこで、並び替えの様子を書き出してみた。
これをみると、ループは調度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;
}
}