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ですが、例外をキャッチするという手もあります。
例外を、引数が範囲外になったことの合図としてとらえるわけです。
(結構細かな話をしたので、今回はわかってもらえる自信なしです)
大変感謝します。
すごくわかりやすかったです。
文字列と文字との違い、ですね(*^_^*)
こういったことはなかなかうまく説明している本はなかったりするので大変ためになりました。
ありがとうございました_(._.)_
No.3
- 回答日時:
#1 です。
> 何がしたかったかと言うと、
> abcdefghijk~
> のような文字列があって
> その1文字ずつをしらべていって
よくわかんないけど、特定の文字もしくは
文字列が含まれているかどうか確認するなら
indexOf メソッドってのもありますんで、蛇足ですが。
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文字目が存在しない場合、例外がスローされます。
これまで私が書いてきたことは、とても重要なことです。過去にも他の方が似たような質問をしているので、過去の投稿履歴を検索してみるのも良いでしょう。
何か分からないことがあったら、おっくうがらずに補足して下さい。
この回答への補足
いろいろありがとうございます。
おっしゃるとおり'a'と言う書き方はできたのですが、
''(空)はできないのかな??
と疑問に思いまして・・・
まだまだ勉強不足ですね・・・
No.1
- 回答日時:
>charが空であることを調べるのにはどうすればいいですか?
空って空白(space)ではないの?
Stringbufferのlengthメソッドで
文字数取得するのでは、ダメなんでしょうか。
この回答への補足
実はlength()で代用しました。
何がしたかったかと言うと、
abcdefghijk~
のような文字列があって
その1文字ずつをしらべていって
その文字が””(空)であれば処理終わり、
としようと思ったのですが・・・
よく考えたら、length()以上の数をcharAtの引数に入れたら例外が出そうですね・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
byte配列→float型の値を読みlon...
-
javaで同じデータが続けば、2行...
-
matchesを否定文として使う方法...
-
バイナリファイルの計算方法
-
UINT64→UINT32[2]にする方法
-
strutsを使って値をやり取りす...
-
ダブルクォーテーションを含む...
-
実行シェルからCOBOLへパラメー...
-
ORA-01858: 数値を指定する箇所...
-
Eclipseのコンソールを常に表示...
-
パソコンキーボードで時分秒を...
-
javaで電卓を作りたいのですが...
-
setPrefferedSizeとsetSize
-
1~100までの数字を表示したい
-
カタカナをローマジに変換する。
-
ColabでのPytorchのエラー
-
1~100までの数字を表示し、か...
-
テキストファイルから空白行をよむ
-
javaです。1月1日から日数入れ...
-
JButton-背景の透明化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
wsprintf関数の使い方について
-
DateTimePickerに値を入れたい...
-
javaのCSVデータ読込についてです
-
ArrayListの要素数の上限
-
C言語の変数(LSB)の合わせ込...
-
BCD形式で時刻を!
-
Stringクラスの変数の格納アド...
-
excel vba 時間計算と条件分岐...
-
ResultSetの内部構造(Java)
-
getParameterの値変更
-
matchesを否定文として使う方法...
-
PSQLExceptionが発生する
-
実行シェルからCOBOLへパラメー...
-
結合した文字列をファイル名に...
-
char型での演算子
-
JSPでHashMap・配列の変数の値...
-
VB6,論理演算子Orの使い方がわ...
-
DOSバッチで変数の値を変数名に...
-
Evaluate()に文字列の形式の数...
おすすめ情報