• ベストアンサー

char型での演算子

畏れ入ります。 X番目の文字を調べたいとき strにStringbufferで文字列が入っていた場合 if(str.charAt != "") とすることができません。 互換性のない型、と出てしまいます。 また、""を’’ とすると、「空の文字リテラルです」 と出てしまいます。 charが空であることを調べるのにはどうすればいいですか?

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

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

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.4

> おっしゃるとおり'a'と言う書き方はできたのですが、 > ''(空)はできないのかな?? と疑問に思いまして・・・ なるほど。 結論から書きますと、(先ほども少し書きましたが)「空の文字」というのは存在しないんです。 このことについて、もう少し説明しますね。 「文字」そのものに関して説明する前に、「文字列」について少し説明したいと思います。 文字列というのは、「文字」がいくつか つながって出来たものなんです。例えば、 "ABDCE" という文字列があったら、 'A' 'B' 'C' 'D' 'E' という5個の文字がつながっていると考えてください。つまり、この文字列に関して言えば、 最初の文字は 'A'、次の文字は 'B'、その次は 'C'…… というようになります。 では、最後の 'E' の後はどうなっているのかというのが気になりますが、実はここには何も存在しないんです。つまり、「空の文字」が存在しているわけではなくて、「文字」そのものが存在していないんです。 だから、'E' の次にある文字を取り出したら「空の文字」になった、というようなことはありえないというわけなんです。 ただし、「空の文字列」や「空の文字列バッファ」はありえるのです。(ここが、ちょっとややこしい) これは、文字列(バッファ)の中に文字が一つも存在していないと考えてください。 先ほどの "ABCDE" という文字列は、5個の文字からできていました。つまり、文字列という枠の中に5個の文字が存在していたわけです。 しかし、空の文字列には文字はありません。文字列という枠の中に文字が一つも入っていないということです。(ただし、文字列という枠そのものは存在しています) 空の文字列は、ダブルクォーテーションマークを二つ続けて "" というように書きます。ダブルクォーテーションマークという枠は存在していますが、その中には何もないわけです。 では、なぜ「空の文字」は存在しないのか。実は、「文字」は「文字列」とはまったく異なった性質を持っているのです。 一つ段ボール箱(=文字列)があったとします。箱の中には、いろんな色のボール(=文字)が入っています。 もし箱の中にボールが一つもなかったら、それは空の文字列です。箱の中にボールが3個入っていれば、それは長さが3の文字列です。 では、箱の中から一つボールを取り出して、そのボールの色を見て見ましょう。 「青」「赤」「緑」「黒」「白」などといろいろ考えられますが、ボールの色が文字の中身を表わしていると考えてください。ボールが赤色だったら、それは '赤' という文字です。 では、もし「空の文字」という文字があるならば、何色でしょうか? 「白」「黒」「無色透明」などが「空の文字」に相当するように思えるかもしれませんが、ちょっと待ってください。 '白'、'黒'、'無' という色が、確かに存在しています。ということは、これは「空の文字」ではありません。 そもそも、ボールという物体が存在していれば、そのボールには何かしら色があるわけで、ボールに色が「無い」ということはありえませんね。 同じように、文字が「空」になることも無いんです。 一つの文字が存在しているとき、その文字は何があろうと「一つの文字」なんです。 さて、 > length()以上の数をcharAtの引数に入れたら例外が出そうですね・・・ とおっしゃっているのは、まさにそのとおりなのです。 文字が存在しないことを知らせるために、例外をスローするわけです。(「空の文字」を返す、ということができないからですね) もちろん、charAt を使う前に引数の値を length とチェックしておくという対策もOKですが、例外をキャッチするという手もあります。 例外を、引数が範囲外になったことの合図としてとらえるわけです。 (結構細かな話をしたので、今回はわかってもらえる自信なしです)

azicyan
質問者

お礼

大変感謝します。 すごくわかりやすかったです。 文字列と文字との違い、ですね(*^_^*) こういったことはなかなかうまく説明している本はなかったりするので大変ためになりました。 ありがとうございました_(._.)_

その他の回答 (3)

回答No.3

#1 です。 > 何がしたかったかと言うと、 > abcdefghijk~ > のような文字列があって > その1文字ずつをしらべていって よくわかんないけど、特定の文字もしくは 文字列が含まれているかどうか確認するなら indexOf メソッドってのもありますんで、蛇足ですが。

azicyan
質問者

お礼

indexOfがありましたね~ 調べてみました。 回りくどいことをやっていたようです。 ありがとうございました

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

まず、Javaにおいて「文字(char)」と「文字列(String)」と「文字列バッファ(StringBuffer)」はすべて異なるものとして扱われますので、注意してください。 例えば、「if(str.charAt != "")」のように書くと、「文字」と「文字列」を比較することになるので、エラーになります。 「文字」は、必ず一つのUnicode文字を表わします。 「文字」同士が同じかどうかを比較するには、==を使います。 「文字列」同士を比較するには、equals というメソッドを使います。== を使って比較することはできません。equals は文字列の「内容」が同じであるか比較するのに対し、== は二つの文字列変数に代入された「インスタンス」が同じであるかを比較するだけです。 「文字列バッファ」についても、比較の仕方は文字列と同じです。 さて、ご質問の件ですが、「空の文字(char)」というものは存在しません。char は、必ず一つのUnicode文字を表わします。 (ただし、「空白」などのUnicode文字を代入することはできます。) 代わりに、「0文字の文字列」とか「0文字の文字列バッファ」は存在します。 文字列や文字列バッファの文字数を調べるには、それらの length メソッドを使います。 なお、charAt メソッドは、文字列あるいは文字列バッファの何文字目かにある文字を取得するものです。 このメソッドでは、文字列(バッファ)の文字数を超える範囲の部分の文字を取得しようとすると、例外が発生します。例えば、文字数が3の文字列に対して charAt(10) を行うと、例外になります。 なお、文字列(バッファ)の文字数は、「長さ」とも呼ばれます。 String 型の変数 str に代入された文字列の長さが3以下であるか調べる例 if (str.length() <= 3) ..... String 型の変数 str に代入された文字列の前から3文字目が 'A' という文字であるか調べる例 if (str.charAt(2) == 'A') ....... 二つ目の例でcharAtメソッドを用いていますが、前から3文字目の文字を取り出すのに2という引数を指定している点に注意してください。「前から何文字目」を表わす数字は、このように一つずれるようになっています。 もちろん、この例では、文字列の長さが3文字以上であることが前提です。文字列の長さが3未満である場合、つまり、文字列に3文字目が存在しない場合、例外がスローされます。 これまで私が書いてきたことは、とても重要なことです。過去にも他の方が似たような質問をしているので、過去の投稿履歴を検索してみるのも良いでしょう。 何か分からないことがあったら、おっくうがらずに補足して下さい。

azicyan
質問者

補足

いろいろありがとうございます。 おっしゃるとおり'a'と言う書き方はできたのですが、 ''(空)はできないのかな?? と疑問に思いまして・・・ まだまだ勉強不足ですね・・・

回答No.1

>charが空であることを調べるのにはどうすればいいですか? 空って空白(space)ではないの? Stringbufferのlengthメソッドで 文字数取得するのでは、ダメなんでしょうか。

azicyan
質問者

補足

実はlength()で代用しました。 何がしたかったかと言うと、 abcdefghijk~ のような文字列があって その1文字ずつをしらべていって その文字が””(空)であれば処理終わり、 としようと思ったのですが・・・ よく考えたら、length()以上の数をcharAtの引数に入れたら例外が出そうですね・・・

関連するQ&A

  • char型からのバイト数取得

    文字列から1文字ずつバイト数を取得(判定)したいのですが、 char型の文字のバイト数を取得するスマートな方法はありますか? 今考えているのは以下のようなコードです。 String str ="あA" for(int i=0; i < str.length(); i++) { char ch = str.charAt(i); StringBuffer SB = new StringBuffer(); SB.append(c); if(SB.toString().getBytes.length == 1) { //1バイトの処理 } else { //2バイトの処理 } }

    • ベストアンサー
    • Java
  • char*型が0x0を含む場合

    char *str = {0x61, 0x62, 0x0, 0x64}; ができないから、 char *str = "abcd"; str[2] = 0; として、{0x61, 0x62, 0x0, 0x64} という文字列を作ってみた。 このポインタ str は解放する必要がない。 malloc( ) で確保したなら free( ) する必用がある。 普通のポインタは、もしかしたら 0x0 までしか 確保されていないのかなと思いました。 この場合では、str[3] == 0x64 だという結果になったけど、 それは str[2] の次のデータが 0x64 だったわけで、 str[2] に 0x0 が入った時点で、str[3] 以降の領域は str とは無関係かもしれないと思いました。 つまり、char*型は、0x0 までの部分だけを確保し、 この例のソースでは、str[3] 以降の領域は確保されていないから 後で、知らないうちに値が変わっている可能性がある。 という想像をしてみたけど、あってますか?

  • String型とchar型の変換エラーです

    今晩は!またまたこの掲示板にきました。よろしくお願いします。 文字列かブランクを取り出すコードを書きましたが、 -------- char ch_check = str.charAt(i+1) ; if(ch_check ==" ") { --------- のところでString型とchar型の混合は受け入れられませんのようなエラーが出ました。 if(ch_check ==" "をboolean型でうけるのも拒否されました。 どこをどのようにしてやればよいでしょうか。 JAVA初心者です、特に文字列の取り扱いは評判通りわかり難くくないています。 よろしくお願いします。 ---------- public class Mojiretu_Blank { public static void main(String[] args) { String str = "This is a pen."; int i = 1 ; int blank_count = 0 ; while( i < (str.length()+1) ) { char ch_check = str.charAt(i+1) ; if(ch_check ==" ") { blank_count ++ ; System.out.println(ch_check); } else{} System.out.print("ブランクの数は" + blank_count + "個です。"); } } }

    • ベストアンサー
    • Java
  • javaというか文字列について少し質問です><

    javaというか文字列について少し質問です>< javaというか文字列について少し質問です>< お願いします。 シーザー暗号で文字列をずらすためのクラスのメソッドをつくったのですが・・・ String decrypt(String str,int key) { StringBuffer sb = new StringBuffer(); // もしくはStringBuilder for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); sb.append( c ); } こんな感じなのですがアルファベットの小文字26文字のみとしたいので暗号化や復号化の際に越えてしまう場合はアルファベット内でループさせたいのですがいまいちやり方が浮かびません><越えてしまう場合はzからひいたものを表現させれば良いかと思いやってみたのですが全然違う文字が出てきてしまいました。何かいい方法を教えてください。お願いします><

    • ベストアンサー
    • Java
  • avaというか文字列について少し質問です><

    avaというか文字列について少し質問です>< お願いします。 シーザー暗号で文字列をずらすためのクラスのメソッドをつくったのですが・・・ String decrypt(String str,int key) { StringBuffer sb = new StringBuffer(); // もしくはStringBuilder for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); sb.append( c ); } こんな感じなのですがアルファベットの小文字26文字のみとしたいので暗号化や復号化の際に越えてしまう場合はアルファベット内でループさせたいのですがいまいちやり方が浮かびません><越えてしまう場合はzからひいたものを表現させれば良いかと思いやってみたのですが全然違う文字が出てきてしまいました。何かいい方法を教えてください。お願いします><

    • ベストアンサー
    • Java
  • 三つの文字を順に並べるプログラム

    三つの文字を入力して、順番に並べて表示させるプログラムが作りたいのですが、どうしたらいいのかわかりません。 二つまではできました。以下に記します import java.io.*; class Sample { public static void main(String args[]) throws IOException { System.out.println("文字列1を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1=br.readLine(); System.out.println("文字列2を入力してください。"); String str2=br.readLine(); int s = 1,t = 0; if(str1.length()>str2.length()){ int len=str1.length(); StringBuffer sb=new StringBuffer(str1); while(s<len+1){ sb.insert(s,str2.charAt(t)); s=s+2; t++; } System.out.println("文字列は"+sb+"となる。"); }else{ int len=str2.length(); StringBuffer sb=new StringBuffer(str2); while(s<len+1){ sb.insert(s-1,str1.charAt(t)); s=s+2; t++; } System.out.println("文字列は"+sb+"となる。"); } } } str1に123 str2に45といった風に入力すると14253といった風になります。 これにstr3を加え、str3が6789ならば、146257389 となる風にしたいです。

    • ベストアンサー
    • Java
  • charAt(0)について

    import java.io.*; class Sample3 { public static void main(String[] args) throws IOException { System.out.println("文字列を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("検索文字を入力してください。"); String str2 = br.readLine(); char ch = str2.charAt(0); int num = str1.indexOf(ch); if(num != -1) System.out.println(str1 + "の" + (num+1) + "番目に「" + ch + "」が見つかりました。"); else System.out.println(str1 + "に「" + ch + "」はありません。"); } char ch = str2.charAt(0);の部分ですが、 charAt(0)というのは ( )に書かれている番号「のみ」を参照するんですよね? だからもし「こ」んちにはと入力しても0番目の「こ」しか出さないはずなのに、 「に」 を入れたらちゃんと「3番目に に が見つかりました」と出るのはなぜですか?

    • ベストアンサー
    • Java
  • char型の比較

    C++で文字の比較をしたいのですが、コンソールアプリで   char str[3] = "困";   printf( "%x", str[0] ); と記述すると、"困"の文字コードは"8da2(Shift_JIS)"なので、   8d と表示されると思っていたのですが、実際は   ffffff8d と表示されます。 同じ理由で文字の比較をする際にも   str[0] == 0xffffff8d または   str[0] == (char)0x8d としなければ正しい結果が得られません。 これは何が原因なのでしょうか? よろしくお願いします。

  • 型変換方法について

    困っています。。 下記コードは文字コードのチェックをしているのですが、チェックする文字コードを直接指定するのではなく、 String code = "0x2460" のように持たせておきたいのですが、この文字列を使ってチェックするにはどうしたらよいでしょうか? char型に変換しないといけないと思うのですが変換方法が分かりません。 API等いろいろ調べてみたのですが分かりませんでした。 どうか宜しくお願いします。 コード---------------------------------------- public class CodeCheck {  public static void main(String[] args) {   String str = "a"; // チェック対象文字   char ch = str.charAt(0);   if(ch == 0x2460) {    // エラー処理   } else {    // 正常処理   }  } } ---------------------------------------------

    • ベストアンサー
    • Java
  • char*型の文字列をchar[10]へ。

    char*型の文字列をchar[0]から順番に格納したいのですが、 どうやってやるかご存知の方おられますでしょうか。 申し訳ございません、宜しくお願い致します。

専門家に質問してみよう