• 締切済み

ループの終わらせ方

ある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回になった時点で止めるようにしてます。

  • Java
  • 回答数3
  • ありがとう数1

みんなの回答

回答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

  • 変数booleanの扱い方

    下記のコードでコンパイルしたところ、出現 int 互換性のない型 要求:boolean boolean bl = 0 ; とエラーが出ました。コード上でまず、bl = 0 と0が入るのがまず分からないのと、trueとfalseを入れ換えているのがわかりません。すみませんが、かなりわかってないので、出来るだけ詳しく説明お願いします。 boolean bl = 0; for(int i=0; i<5; i++) for(int j=0; j<5; j++) if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } } お決まりのクラス宣言などのコードは省きました。

    • ベストアンサー
    • Java
  • for文

    質問お願い致します。 これのソースのfor文を一つの文にするにはどのように書いたらよいでしょうか? お願い致します。 //指定された文字列が"a"と"b"の両方を含む場合はtrue、なければfalseを返す public class Mondai { public static void main(String[] args) { System.out.println("解答 :" + charBothContain("Habllow")); } public static boolean charBothContain(String str) { boolean answer1 = false; boolean answer2 = false; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'a') { answer1 = true; break; } } for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'b') { answer2 = true; break; } } return answer1 && answer2; } }

    • ベストアンサー
    • Java
  • 【Java】ある数列から、素数を探すプログラムについて

    Java初心者です。独学なので質問できる環境が無く、 こちらで質問致します。回答をお願い致します。 以下のプログラムについて質問です。 class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } 上記の「配列の初期化」の個所、 for(int i = 0; i < max; i++) a[i] = true; ここでなぜ、a[i] = true;となるかわかりません。 0と1はどちらも素数ではないと思うので、 私はtrueではないと思うのですが・・・。 ぜひとも教えて頂きたいと思います。

    • ベストアンサー
    • Java
  • 穴埋めができずに困ってます…(初心者です)

    参考書に出ていた問題について質問です。 穴埋め形式になっていて、途中までは埋まったのですが、最後の部分がわかりません。 StringBuffer bf = new StringBuffer(); boolean let; for (int i = 0 ; i < (bf.length()); i ++){ let = true; for (int j = 0; j <(nch.length()); j ++){ if (inputstr.charAt(i) == nch[j]) let = false;} if (let) ×××} return ×××;}//bfをstring型に変えて戻り値} の×××の部分です。 引数として与えた文字列から数字以外の文字を抜き出すプログラムなのですが、どこで何を行っているのかがよくわからなくなってきています。 回答お願いします。

    • ベストアンサー
    • Java
  • 素数を求めるマクロを

    走らすと暴走したようになり、素数=151で止まります。 どこが悪いのでしょうか。正常に終わるようにしたいです。 ====================== Sub 素数を求める()   Dim i As Long   Dim j As Long   Dim m As Long   Dim p As Long   Dim flg As Boolean   i = 1   j = 1   p = 2   Do     flg = False     For m = 2 To Int(Sqr(p))       If p Mod m = 0 Then         flg = True         Exit For       End If     Next     If flg = False Then       Cells(i, j) = p       i = i + 1       If i > Rows.Count Then         i = 1         j = j + 1       End If     End If     p = p + 1   Loop End Sub ======================

  • どこがエラーか確認してください…

    プログラムを作ったのですが、さまざまなエラーが出てしまいます。 与えた引数を数字と文字にわけるというプログラムです。 public class Selection { private static final char[] nch = { '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' };//0から9までの数字をchar型配列要素として定義 public static String numbersonly(String inputstr) { StringBuffer bfn = new StringBuffer(); for (int i = 0 ; i < inputstr.length(); i++) { for (int j = 0;j < nch.length() ; j++) { if(inputstr.charAt(i) == nch[j]) bfn.append(inputstr.substring(i)); //bfnにinsputstrのi番目の文字を付け足す } } return; bfn.toString(); //bfnをstring型に変えて戻り値 } //numbersonlyメソッドの場合と同様に以下も補う public static String lettersonly(String inputstr) { StringBuffer bfn =new StringBuffer(); boolean let; for (int i = 0; i < inputstr.length(); i++) { let = true; for(int j = 0; j < nch.length(); j++) { if(inputstr.charAt(i) == nch[j]) let =false; } if (let)bfn.append(inputstr.substring(i)); } return;bfn.toString(); } } はじめのchar型配列要素として定義するところでシンボルを解決できません、となっているので、そのほかのnchを使う部分(lengthメソッド、戻り値)にも影響が出ているのか、jのlengthメソッドもどちらともシンボル解決できず、それぞれreturnでは戻り値がありません、となります。

    • ベストアンサー
    • Java
  • javaで素数を探すプログラム。

    javaで素数を探すプログラム。 初歩的なことかと思いますが、助言をお願いします。 if(a[i-1]) ←この部分がわかりません。これはどのような条件がなのでしょうか? class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } このプログラム

    • ベストアンサー
    • Java
  • javaの二次元配列について質問です

    配列上にあるただ一つの1を入力に応じて移動させるプログラムを作っています。 たとえば0が入力されたら 0, 0, 0 0, 1, 0 0, 1, 0 → 0, 0, 0 0, 0, 0 0, 0, 0 という風に移動させ、端に行ったら移動できないようにしたいです。 今書いたプログラムだと、最初にある1が残ったままになってしまいます。 int[] p = {-1, -1}; int[][] im = new int[3][3]; Scanner scn = new Scanner(System.in); for (int i = 0; i < p.length; i++) { p[i] = 1; } im[p[0]][p[1]] = 1; for (int i = 0; i < im.length; i++) { for (int j = 0; j < im[i].length; j++) { System.out.print(im[i][j] + ","); } System.out.println(); } int n = 0; n = scn.nextInt(); if (n == 0) { p[0] -= 1; } else if (n == 1) { p[1] += 1; } else if (n == 2) { p[0] += 1; } else if (n == 3) { p[1] -= 1; } im[p[0]][p[1]] = 1; for (int i = 0; i < im.length; i++) { for (int j = 0; j < im[i].length; j++) { System.out.print(im[i][j] + ","); } System.out.println(); }

  • ランダムでのboolean値の与え方

    boolean[] box = new boolean[100] と設定した配列にランダムでtrue か false を与えたいのですが方法がよくわかりません。そのときtrueの数は配列の全体数の2分の1以下(上の配列だと50以下)になるようにしたいのですが、どうすればよいですか?

    • ベストアンサー
    • Java
  • booleanの戻り値について

    配列の等価判定をしたいのですが思うように動かないです。 助けてください import java.io.*; class Kadai4 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] TBL1; int[] TBL2; TBL1 = new int[5]; TBL2 = new int[5]; boolean flg=true; System.out.println("配列1を入力"); for (int i = 0; i <= 4; i++) { String s1 = br.readLine(); int t1 = Integer.parseInt(s1); TBL1[i] = t1; } System.out.println("配列2を入力"); for (int i = 0; i <= 4; i++) { String s1 = br.readLine(); int t1 = Integer.parseInt(s1); TBL2[i] = t1; } // 配列表示 System.out.println("配列表示"); for (int i = 0; i < TBL1.length; i++) { System.out.print(" TBL1[" + i + "]=" + TBL1[i]); } System.out.println(""); for (int i = 0; i < TBL2.length; i++) { System.out.print(" TBL2[" + i + "]=" + TBL2[i]); } toka(TBL1, TBL2); System.out.println(""); if (flg == true) { System.out.println("配列は等価"); } else { System.out.println("配列は非等価"); } } private static boolean toka(int[] ss1, int[] ss2) { boolean flg = true; for (int i = 0; i < ss1.length; i++) { if (ss1[i] != ss2[i] || ss1.length != ss2.length) { flg=false } } return flg; } }

専門家に質問してみよう