• ベストアンサー

booleanの意味・・・

お世話になります。 javaの勉強をし始めたばかりなのですが booleanの理解がなかなか出来なくて困っています。 例えば、 public ArrayList search(ArrayList blist, String word) { boolean hit = false; ArrayList setList = new ArrayList(); for (int i=0; i<blist.size(); i++) { Parson bean = (Parson) blist.get(i); int n =bean.getName().indexOf(word); if (n != -1) { setList.add(bean); hit = true; } } if (! hit) { System.out.println("その文字では検索できません!"); } return setList; } というプログラムで、booleanを使っていてif (n != -1)のブロックに 入った時は、hit=tureで下のif (! hit)の処理を行うのは分かるのですが…。 もし、if (n != -1)のブロック内に入らなければhitはfalseのままでは ないのでしょうか? falseのまま、if (! hit)のブロックにきたらhitはtrueになるので 処理は行われないのでは?と思うのですが…。 この辺の理解ができなくて、教えて頂きたく思います。 宜しくお願いします。

  • Java
  • 回答数5
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • bdr
  • ベストアンサー率43% (35/80)
回答No.5

javaはあまり詳しくないのですが、ご質問の処理ロジックは良く使用され、この場合ループ処理の結果を判断するための変数として使っています。 恐らく「boolean」の理解ができないというより、処理ロジックが理解できないのではないでしょうか? プログラム全体の流れは以下のとおりです (1)ループ開始前:false (2)ループ処理開始  (2-1)ループ内処理が条件にあった場合:true  (2-2)ループ内処理が条件に合わなかった場合:変更なし (3)ループ処理後  true:ループ中一回でも条件に合った場合  false:ループ中一度も条件に合わなかった場合 という全体の流れです。 つまり、for (int i=0; i<blist.size(); i++) {}のループの中で一度でも条件にあえば、条件にあった配列を返し、一度も条件にあわなかった場合は空のリストを返すと同時にエラーログを出すというものです。 ちなみに「boolean」はtrueかfalseしか入れられない変数です。

fa_fa0321
質問者

お礼

詳しい回答ありがとうございました!参考になりました★

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>もし、if (n != -1)のブロック内に入らなければhitはfalseのままではないのでしょうか? その通りです。 (! hit) は、hit の値を自体を変更しません。 反転した値をif の条件として使用しているだけです。

fa_fa0321
質問者

お礼

回答ありがとうございました!参考になりました★

noname#19197
noname#19197
回答No.3

boolean の意味は、真偽です。 trueが真で falseが偽です。 これは、基本なのでしっかり理解して下さい。 また、演算の!は否定を表します。 !trueはfalseで、 !falseはtrueになります。 if文やwhile文の検証booleanで行われ、 判定がtrueの場合に、ステートメントが実行されます。 この例でいうと if (!hit)も if (hit != true)も if (hit == false)も 同じ意味です。 なので、hitは宣言時にfalseで初期化されていますので、 if (n != -1) ブロックに入らなければ、hitはfalseのままです。 なので、 if (! hit) の判定は、 if (!false)となり、 if (false == false)となり、 その処理は行われますね。

fa_fa0321
質問者

お礼

詳しい回答ありがとうございました!難しく考えていた様です…。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

追記 > if (n != -1)のブロックに > 入った時は、hit=tureで下のif (! hit)の処理を行うのは分かるのですが…。 ifの条件文は「hitの否定」です。 hitがtrueのときは、条件文がfalseになるので、中の処理は行われません。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

・宣言時にhit=falseにしています。 ・forループ中に、一度でもnが-1以外になったら、hit=trueになります。 ・if文でhitがfalseだったら文字を表示します。 ・値を返して終了です。 > falseのまま、if (! hit)のブロックにきたらhitはtrueになるので ifの条件文がtrueになるので、処理が行われます。 hitに代入をしていないので、hit自体に変化はありません。

fa_fa0321
質問者

お礼

詳しい回答ありがとうございました!参考になりました★

関連する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
  • booleanについて

    お世話になります。 javaを始めて10日程の初心者です。 boleanの使い方がよく分かりません。 例: public class a { public static void main(String[] args){ // "あなたは20歳以上ですか?(Yesならtrue、Noならfalse)"; boolean isAdult = true; if (isAdult) { System.out.print(" 成人です "); } else { System.out.print(" 子供です "); } } } これを実行すると、”成人です”が出力されます。 例えばbooleanを使用せずに int age; if(age>=20) { System.out.print(" 成人です "); } else { System.out.print(" 子供です "); } とすれば解決できるのですが、 booleanを使用しようとすると理解できなくなります。 宜しくお願いします。

  • boolean型

    class Bool {   static boolean b;   public static void main(String [] args) {     int x=0;     if (b ) {       x=1;     }     else if (b = false){       x=2;     }     else if (b){       x=3;     }     else {       x=4;     }     System.out.println("x = " + x);     System.out.println(b=false);   } } SUNのサイトにあった「どのような結果になるか」と言う問題なのですが、8行目の if(b=false) の部分がifの括弧の中はBoolean型じゃないといけないのに 代入してるからコンパイルエラーだなとおもったのですが あっさりコンパイルは通ってx=4と言う出力です・・・ (b=false) と言うのはどのようにコンパイルされているのですか?? なぜ 代入が、BooleanとしてOKなのでしょうか??

    • ベストアンサー
    • Java
  • boolean型の戻り値は可能か

     今日は、Cの初心者です。  比較した値をboolean型でとりたいのですが、色々と調べたのですが、Cではboolean型は定義されてないのでしょうか。  if(a>b); printf("true\n");というような書き方しか出来ないのでしょうか。  例えば   if(a>b);   printf("%●\n"、(a>b));  という書き方で直接"true"とか"false"を取らすとか、  "0"、"1"、"-1"の戻り値をとらせることは出来ないのでしょうか。

  • vba boolean変数を開放する方法

    エクセルのセルに「○○○○○○○○○○××××××××××」と入っているものをランダムに並べ代えるマクロを探してみました。 Sub macro2() Dim i, m As Integer Dim b, c As String Dim flg(1 To 20) As Boolean b = Cells(1, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(1, 2).Value = c End Sub これはうまく動くのですが、10行分やろうとして、以下のように変更すると暴走(終わらない)します。 Sub macro2() Dim i, m, n As Integer Dim b, c As String Dim flg(1 To 20) As Boolean For n = 1 To 10 b = Cells(n, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(n, 2).Value = c next n End Sub 一行目が終わってもboolean変数の値がそのまま残っているのが原因らしいのですが開放する方法がわかりません。 取りあえずもう一つマクロを追加してやりたいことはできたのですが、 Sub macro1() Dim n As Integer For n = 1 To 10 Call macro2(n) Next n End Sub Sub macro2(n As Variant) 以下略 なんかスッキリしません。 boolean変数を開放し、マクロひとつですます方法を教えて頂きたくお願いします。 flg(m) = Falseを挿入してもダメでした。

  • 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; } }

  • プログラムのスレッド化について。

    以下の処理をスレッド化しようとしています。 public class FCP{ int N=10 long LOOP_MAX=100 double x[][] = new double[N][4] int g[][] = new int[N][4] boolean y[][] = new boolean[N][4]//出力 boolean A[][] = new boolean[N][10] double T=0.5 Set_Adjacent_Matrix() //A配列にtrueとfalseを代入 Set_initial_value() //y配列に初期値を代入(Math.random()>0.5) g1(int i, int j) //k<4 sum=1 if( y[i][k] == true ) --sum return(double)sum g2(int i, int j) //k<N sum=0 if( y[i][j] == true ) if( y[k][j] == true && A[i][k] == true ) --sum return(double)sum Display_output() //結果表示 if( y[i][j] ) System.out.print("0") else System.out.print(".") public static void main(String args[]) { long loop; int i, j, k; Set_Adjacent_Matrix(); Set_initial_value(); for( loop=0; loop<LOOP_MAX; loop++ ){ for( i=0; i<N; i++ ){ for( j=0; j<4; j++ ){ x[i][j] = g1( i, j ) + g2( i, j ); if( y[i][j] ){ x[i][j] += T; }else{ x[i][j] -= T; } if( x[i][j] > 0.0){ y[i][j] = true; }else{ y[i][j] = false; } } } Display_output(); } } 今回Threadクラスの継承を使ってスレッド化しようと考えました。runメソッドには上のプログラムのmain部分の処理をさせようと思っています。そしてstartメソッドで必要な数(Nの値=10コ)のスレッドを生成しrunメソッドを実行する。 と、ここまではわかったのですが、「生成された各スレッドの番号を保持し、そのスレッドに担当させる処理を決める」という部分をどうすればいいのかわかりません。 「i(1~10)番目のスレッドはN(1~10)列目の処理を担当している」という風にするにはどうしたらいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • booleanのエラーコードーの意味が分かりません

    三角形を作るコードを書きました、JAVAの超初心者です宜しくお願いします。 下記のエラーコードが出ています。 1.「型Mathのメソッドabs(int)は引数(boolean)に適用できません。」 ここでどうしてもbooleanで答えを表示させたい場合には、どこをどのように書き直せばよいのでしょうか。 このような書き方がエラーであれば全てのbooleanコードーがエラーになってしまうような気がするのですが。 2.これをEclipseで実行させた場合には、args[1]~args[2]のデーター入力はどのようにしてやるのでしょうか。 実行させたときにキーから入力してやるのですか。 3. コンスタラクタ「this.L1 = a ;」でわざわざ「L1=a;」を定義してやる意味が良く分かりません。 他のメッソド「boolean isTriangle()」、「double getArea()」は「L1・・」で定義されている関数なのにわざわざ「L1=a;」を定義してやる意味が理解できません。 このケースではたまたまコンストラクタは必要ないし、省略も可かもしれませんが。 メッソドの後ろの「()」は、必要の場合はメッソドの引数を入れると本には書いていますが、クラス内で、メンバー変数として(この場合は「int L1, L2, L3 ;」)定義してやれば、メッソドからは、アクセスできるのでそのような処理がなぜ必要かがわかりません。 以上宜しくお願い致します。 ________________________________ class Sample { int L1, L2, L3 ; Sample (int a, int b, int c) { this.L1 = a ; this.L2 = b ; this.L3 = c ; } boolean isTriangle() { if(( L1 + L2 ) > L3 && Math.abs(( L1 - L2 ) < L3 )) { boolean S_bool = true ;     } else{ boolean S_bool = false ; } return S_bool ; } double getArea() { double S = (double)((L1+L2+L3)/2.0) ; double area = Math.sqrt(S*(S-L1)*(S-L2)*(S-L3)); return area ; } } class Sample_Test { public static void main(String args[]) { int s1 = Integer.parseInt( args[ 0 ] ) ; int s2 = Integer.parseInt( args[ 1 ] ) ; int s3 = Integer.parseInt( args[ 2 ] ) ; Sanmple t1 = new Sample ( s1 , s2 , s3 ) ; boolean sankaku = t1.isTriangle() ; double menseki = t1.getArea() ; System.out.println( sankaku ) ; System.out.println( menseki ) ; } }

    • ベストアンサー
    • 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初心者です。どうか教えてください><

    1週間ほど前からJavaの勉強を始めたものです。初歩的な質問で申し訳ないのですが、是非おしえていただきたくて投稿いたしました。 秀和システムからでている「わかりやすいJava入門編」を使って勉強しているのですが、課題の1つでつまづいてしまい、解決法がわからないので質問させていただきました。 課題の内容は以下です。 1、10本のうち3本が当たりで、最大10回引ける。あたりが出たら取り出す。3つ全てあたりが出たら終了。 2、eclipseのコンソール画面上から「キーをタイプすればくじが引けます」と表示、キーを入力すればくじ引き開始。 3、キー入力後0.1秒ごとに ■ が表示され、1秒後10個になった時点でくじ引き結果表示。 そこで、わたしは、まずint[ ]の配列を10個用意し、ループ分で[0]~[9]まで順にランダムに0~9の数字を入力し、 i番目の[i]に入っている数字が、それより以前の配列に入っている場合、[i]配列の抽選をやりなおす、というやり方でやろうと思って以下のような書き方をしたのですが、どうやら間違っているようで重複の場合のやり直しをしてくれません;; 初心者なので、見づらい書き方をしているかもしれませんがお許しください>< package exercise; import lib.Input; public class Lot_6 { static int[] lot = new int[10]; static int i; public static void main(String args[]){ int a = 0; for(int i=0; i < lot.length ;i++){ if (a < 3){ Input.getString("キーをタイプするくじが引けます"); animation(); do{ lot[i]=(int)(10*Math.random()); } while(isTrue()); if((lot[i] == 0) ^ (lot[i] == 1) ^ (lot[i] == 2)){ System.out.println("あたり"); a++; } else { System.out.println("はずれ"); } } else { break; } } } public static void animation() { for(int m = 0;m < 10;m++){ System.out.print("■ "); delay(100); } } public static void delay(int t) { try { Thread.sleep(t); } catch (InterruptedException e) { e.printStackTrace(); } } public static boolean isTrue(){ boolean is = false; for(int n=0;n <= i-1;n++){ if(lot[i] == lot[n]) is = true; else { continue; } } return is; } } そこで、間違っている箇所を調べるために do{ } while();ループの中にSystem.out.println(isTrue());を加え、if(a < 3) { }の内の最後にSystm.out.println(lot[i]);を加えました。 ちゃんと重複した場合isTrue()にTrueを返しているか、重複した場合やりなおしをしてくれているか、を調べるためです。 そしてコンソール画面の実行結果が以下です。 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 6 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 3 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false あたり 1 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 4 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false あたり 0 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 4 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 4 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 5 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 9 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false あたり 2 数字が重複していますし、trueが一個もありません。 ということはisTrue()メソッドの部分で誤りがあるんでしょうか? public static boolean isTrue(){ boolean is = false; for(int n=0;n <= i-1;n++){ if(lot[i] == lot[n]) is = true; else { continue; } } return is; } こう書けば、lot[i]がlot[0]~lot[i-1]の間でいつでも重複しているものがあれば boolean is = true;により上書きされて、isTrue()はtrueが返されると思ったのですがそうはならないのでしょうか。 すいません。いろいろ手は尽くしたのですがどうしても分からなくて質問させていただきました。 ご回答いただけますとうれしいです><b

専門家に質問してみよう