前々回、データ型の説明の中で、文字について触れました。 今日は、文字の使用例を紹介します。
文字型の変数を宣言するには、
char 変数;
と書きます。
プログラムの中で文字を表すには、その文字をシングルクオート(
'
)で囲みます。
ただし、ダブルクオート(
"
)は
'\"'
, シングルクオート(
'
)は
'\''
, バックスラッシュ(
\
)は
'\\'
と書きます。
次のプログラムは、変数 x に文字'A'を格納して、それを取り出すものです。
/* 1*/ class CharacterTest { // 文字のテスト /* 2*/ public static void main (String[] args) { /* 3*/ char x; /* 4*/ x = 'A'; // 文字'A'を格納 /* 5*/ System.out.println(x); /* 6*/ } /* 7*/ }
24102a1:java1 k12x1001$ java CharacterTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 A 24102a1:java1 k12x1001$
文字同士を比較するには、関係演算子
==
を使います。
例えば、条件
'A' == 'A'
は成り立ち、条件
'A' == 'B'
は成り立ちません。
さらに、文字については、関係演算子
>
および
<
が使えます。
これは、文字符号の大小関係を意味します。
例えば、文字'A'の文字符号は65で、文字'B'の文字符号は66なので、条件
'A' < 'B'
は成り立ち、条件
'A' > 'B'
は成り立ちません。
関係演算子
>=
(以上)、
<=
(以下)、および
!=
(等しくない)も、整数のときと同じように使えます。
これまで、文字列は、
System.out.println("OK");
のように、画面出力のときのみ使ってきました。 実は、文字列を変数に格納したり、文字列から文字を取り出したりできます。 ここでは、文字列の使い方について説明します。
文字列型の変数を宣言するには、
String 変数;
と書きます。
プログラムの中で文字列を表すには、その文字列をダブルクオート(
"
)で囲みます。
ただし、文字列の中にダブルクオート(
"
)、シングルクオート(
'
)、バックスラッシュ(
\
)がある場合は、それぞれ
\"
,
\'
,
\\
と書きます。
次のプログラムは、変数 x に文字列"OK"を格納して、それを取り出すものです。
/* 1*/ class StringTest { // 文字列のテスト /* 2*/ public static void main (String[] args) { /* 3*/ String x; /* 4*/ x = "OK"; // 文字列を格納 /* 5*/ System.out.println(x); /* 6*/ } /* 7*/ }
24102a1:java1 k12x1001$ java StringTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 OK 24102a1:java1 k12x1001$
2つの文字列を演算子
+
で結ぶと、文字列が連結されます。
一方だけが文字列の場合は、他方が文字列に変換されて連結されます。
次のプログラムは、文字列"All", " ", "right"および"."を連結するものです。
/* 1*/ class StringAppend { // 文字列の連結 /* 2*/ public static void main (String[] args) { /* 3*/ String str1, str2, str3; /* 4*/ str1 = "All"; /* 5*/ str2 = "right"; /* 6*/ str3 = str1 + " " + str2 + "."; // 文字列を連結 /* 7*/ System.out.println(str3); /* 8*/ } /* 9*/ }
24102a1:java1 k12x1001$ java StringAppend Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 All right. 24102a1:java1 k12x1001$
「
文字列1
」と「
文字列2
」を比較するとき、
文字列1
==
文字列2
と書いても思った通りになりません。
文字列のすべての文字が一致することを確かめるには、
文字列1.equals(文字列2)
と書きます。
プログラムの実行中にデータ入力を行うには、整数の場合は式
Integer.parseInt(br.readLine())
を使い、実数の場合は式
Double.parseDouble(br.readLine())
を使いました。 文字列を入力するには、単に式
br.readLine()
を書けばよいです。
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class StringInputTest { // 文字列入力のテスト /* 4*/ public static void main (String[] args) throws IOException { /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); /* 6*/ BufferedReader br = new BufferedReader(isr); /* 7*/ String x; /* 8*/ System.out.print("文字列を入力してください: "); /* 9*/ x = br.readLine(); // 入力 /* 10*/ System.out.println(x); /* 11*/ } /* 12*/ }
24102a1:java1 k12x1001$ java StringInputTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 文字列を入力してください: All right. All right. 24102a1:java1 k12x1001$
「 文字列 」の文字数(長さ)は、式
文字列.length()
で取り出せます。 配列の要素数の取り出し方と似ていますが、配列の場合は括弧が付きません。 また、「 文字列 」の「 番号 」番目の文字を取り出すには、
文字列.charAt(番号)
とします。
次のプログラムは、文字列"All right."の中の文字を一つ一つ取り出して出力するものです。
/* 1*/ class StringPrint { // 文字列の出力 /* 2*/ public static void main (String[] args) { /* 3*/ int i; /* 4*/ char ch; /* 5*/ String str = "All right."; /* 6*/ for (i = 0; i < str.length(); i++) { // 文字数回繰り返す /* 7*/ ch = str.charAt(i); // i番目の文字 /* 8*/ System.out.println(ch); /* 9*/ } /* 10*/ } /* 11*/ }
24102a1:java1 k12x1001$ java StringPrint Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 A l l r i g h t . 24102a1:java1 k12x1001$
なお、「 文字列 」の「 番号 」番目の文字を「 文字 」に変更しようとして、
文字列.charAt(番号) = 文字; // 間違い
と書いても、エラーになるだけです。 文字列は、一度作成すると変更はできません。 文字列を変更するには、文字列バッファというものを利用します。 ただし、文字列バッファは多少難しいので、この授業では取り上げません。 この授業では、文字列を変更するのではなく、文字列を作り直すことにします。
ここで、文字と文字列を扱うプログラムの例を紹介します。
以下のプログラムは、入力された文字列の中のスペース以外を、すべて星印(*)に置き換えるものです。 アルゴリズムの要点は、文字列の中の文字を一つずつ取り出し、それがスペースでないならば星印に置き換えることです。 ただし、入力された文字列 str は変更できないので、結果の文字列 result を用意します。 str から取り出した文字がスペースならば result にスペースを連結し、そうでないならば result に星印を連結します。
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class StringHide { // スペース以外を星印にする /* 4*/ public static void main (String[] args) throws IOException { /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); /* 6*/ BufferedReader br = new BufferedReader(isr); /* 7*/ int i; /* 8*/ char ch; /* 9*/ String str, result; /* 10*/ System.out.print("文字列を入力してください: "); /* 11*/ str = br.readLine(); // 文字列を入力 /* 12*/ result = ""; // 結果を空にする /* 13*/ for (i = 0; i < str.length(); i++) { // 文字列の長さだけ繰り返す /* 14*/ ch = str.charAt(i); // i番目の文字 /* 15*/ if (ch == ' ') { // 文字がスペースなら /* 16*/ result = result + ch; // 文字を連結 /* 17*/ } else { // そうでないなら /* 18*/ result = result + '*'; // 星印を連結 /* 19*/ } /* 20*/ } /* 21*/ System.out.println(result); /* 22*/ } /* 23*/ }
24102a1:java1 k12x1001$ java StringHide Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 文字列を入力してください: All right. *** ****** 24102a1:java1 k12x1001$
今後の予定は以下の通りです。
この授業の成績は、レポートの提出が80%, 試験の得点が20%という割合で決まります。 レポートについては、「余力のある人」のための問題にも取り組んでいれば加点します。 逆に、レポートが未提出なら、そのレポートは0点です。
入力された文字列からスペースを取り除くプログラムを作成してください。
24102a1:java1 k12x1001$ java StringShorten Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 文字列を入力してください: This is a pen. Thisisapen. 24102a1:java1 k12x1001$ java StringShorten Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 文字列を入力してください: Is this a pen? Isthisapen? 24102a1:java1 k12x1001$ java StringShorten Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 文字列を入力してください: Yes, it is. Yes,itis. 24102a1:java1 k12x1001$
余力のある人は、スペースだけでなく、ピリオド(.)、コンマ(,)、疑問符(?)、感嘆符(!)も取り除いてください。
24102a1:java1 k12x1001$ java StringShorten2 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 文字列を入力してください: This is a pen. Thisisapen 24102a1:java1 k12x1001$ java StringShorten2 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 文字列を入力してください: Is this a pen? Isthisapen 24102a1:java1 k12x1001$ java StringShorten2 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 文字列を入力してください: Yes, it is. Yesitis 24102a1:java1 k12x1001$
今日の演習14の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(k12x1001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(1月17日)を明記してください。
「学生による授業評価」アンケートに回答してください。 個別設問1は「授業の学生アシスタントまたはTAは役に立ちましたか?」とします。