• 締切済み

ループの終わらせ方

あるboolean配列でtrueなら■falseなら□を表示させ、時間とともにある規則で動かしていくプログラムを組みました。配列の宣言などを省略してますがこんな感じです。 do{ boolean[] box2 = (boolean[]) box.clone(); for ( i = 0; i < box2.length; i++) { if (box2[i]) { // コピーの玉があったら // 右方向に向かって空き箱を探す。 for (int j = 1; j < box.length; j++) { int p = (i + j) % box.length; if (! box[p]) { // 空き箱を見つけたので玉を入れる(trueにする)  box[p] = true; // 元の場所は玉を消す(falseにする) box[i] = false; // box2[i]はもう二度と調べないのでそのまま放置 break;   } }   } } box2 = null; for(h=0; h < box.length; h++){   if(box[h] == false) System.out.print("□"); if(box[h] == true) System.out.print("■"); } r++; }while(box == box && r<20); ちなみに表示結果は □■■□□■□□■□□■ ■□□■■□■□□■□□ □■□□□■□■■□■□ ・ ・ こんな感じになります。ここで質問なんですが、 過去と同じ配置の配列が出てきた時点でwhile文の ループを終わらせるにはどうすればよいでしょうか? 現時点ではループが20回になった時点で止めるようにしてます。

みんなの回答

回答No.3

もう解決されているかもしれませんが。 No1です。 LinkedListなどのコレクション系の使い方ですが、 格納できるのはObjectです。 従って、 例えば整数10を格納するときは、 LinkedList list = new LinkedList(); list.add(new Integer(10)); みたいにします。 とりだすときは Integer i = (Integer)list.get(0); みたいにします。 さきほどはたとえとして、 結果を整数のラッパークラスIntegerで格納するようお勧めしましたが、 文字列Stringでもよいです。

すると、全ての回答が全文表示されます。
  • ratsbane
  • ベストアンサー率40% (4/10)
回答No.2

例えばですが、while文の外にHashSetのsetという変数をnewしてるとして、 String str = ""; for(h=0; h < box.length; h++){   if(box[h] == false){ System.out.print("□"); str += "□"; } if(box[h] == true){ System.out.print("■"); str += "■"; } } r++; }while(set.add(str)); とかどうでしょうか? 試してませんけど。

kuropanda
質問者

お礼

ありがとうございます。試してみます。

すると、全ての回答が全文表示されます。
回答No.1

私だったら、 これまでの結果をLinkedListなんかに突っ込んでいって、同じかどうか調べます。 メソッドcontainsで同じものがあるか判定できます。 ■を0、□を1とかにして、整数として突っ込むと楽かもしれません。

kuropanda
質問者

補足

アドバイスのように■を1、□を0とおくint型のbox5[]という配列をおいてみました。そして、LinkedListを使ってみたんですが、エラーが出てなかなか前に進めなくなりまして、よろしかったらアドバイスいただけませんか? import java.math.*; import java.io.*; import java.util.Random; import java.util.LinkedList; class hako4 { public static void main(String args[]) throws IOException { boolean[] box = new boolean[20]; boolean[] work = new boolean[1]; boolean[] boxx =new boolean[20]; int[]box5 = new int[box.length]; boolean c=false; LinkedList linkedList = new LinkedList(); int length=1; int l=0; int i,v; int r =0; // boolean[0]~[29]をtrueで初期化 for (i = 0 ; i < 5 ; i++){ box[i] = true; } // boolean[30]~[99]をfalseで初期化 for (i=5 ; i < 19 ; i++){ box[i] = false; } // 100回入れ替えを行う for (int count = 0 ; count < 19 ; count++){ // 0~99のランダム値を2つ取得 int x = (int)(Math.random() * 19); int y = (int)(Math.random() * 19); // 上記で選択された値を配列の要素番号として // 入れ替え work[0] = box[x]; box[x] = box[y]; box[y] = work[0]; } for(i=0; i < box.length; i++){ if(box[i] == false)  System.out.print("□"); if(box[i] == true) System.out.print("■"); } for(i=0; i < box.length; i++){ boxx[i] = box[i]; } int h,k; do{ boolean[] box2 = (boolean[]) box.clone();   for ( i = 0; i < box2.length; i++) { if (box2[i]) { // コピーの玉があったら // 右方向に向かって空き箱を探す。 for (int j = 1; j < box.length; j++) { int p = (i + j) % box.length; if (! box[p]) { // 空き箱を見つけたので玉を入れる(trueにする) box[p] = true; // 元の場所は玉を消す(falseにする) box[i] = false; // box2[i]はもう二度と調べないのでそのまま放置 break; } } } } box2 = null; System.out.println(""); for(h=0; h < box.length; h++){ if(box[h] == false) System.out.print("□"); if(box[h] == true) System.out.print("■"); } for(h=0; h < box.length; h++){ if(box[h] == false) box5[h]=0; if(box[h] == true) box5[h]=1; } if(r>=1){ for(h=0; h < box.length; h++){ c=linkedList.contains(box5[h]);    }    }  for(h=0; h < box.length; h++){ linkedList.add(box5[h]); } r++; }while(c==true); } } ここで下のようなエラーが出て困ってます。よろしくお願いします。 hako4.java:101: シンボルを見つけられません。 シンボル: メソッド contains(int) 場所 : java.util.LinkedList の クラス c=linkedList.contains(box5[h]); ^ hako4.java:105: シンボルを見つけられません。 シンボル: メソッド add(int) 場所 : java.util.LinkedList の クラス linkedList.add(box5[h]);

すると、全ての回答が全文表示されます。

関連するQ&A