前々回、データ型の説明の中で、文字について触れました。 今日は、文字の使用例を紹介します。
文字型 ( character type )の変数を宣言するには、
char 変数名;
と書きます。
プログラムの中で文字を表すには、その文字をシングルクオート(
'
)で囲みます。
ただし、ダブルクオート(
"
)は
'\"'
, シングルクオート(
'
)は
'\''
, バックスラッシュ(
\
)は
'\\'
と書きます。
次のプログラムは、変数 x に文字'A'を格納して、それを取り出すものです。
class CharacterTest { // 文字のテスト public static void main (String[] args) { char x; x = 'A'; // 文字'A'を格納 System.out.println(x); } }
PS ...\Desktop\java1> & ... 'CharacterTest' A PS ...\Desktop\java1>
文字同士を比較するには、関係演算子
==
を使います。
例えば、条件
'A' == 'A'
は成り立ち、条件
'A' == 'B'
は成り立ちません。
さらに、文字については、関係演算子
>
および
<
が使えます。
これは、文字コードの大小関係を意味します。
例えば、文字'A'の文字コードは65で、文字'B'の文字コードは66なので、条件
'A' < 'B'
は成り立ち、条件
'A' > 'B'
は成り立ちません。
関係演算子
>=
(以上)、
<=
(以下)、および
!=
(等しくない)も、整数のときと同じように使えます。
これまで、文字列は、
System.out.println("OK");
のように、画面出力のときのみ使ってきました。 実は、文字列を変数に格納したり、文字列から文字を取り出したりできます。 ここでは、文字列の使い方について説明します。
文字列型 ( string type )の変数を宣言するには、
String 変数名;
と書きます。
プログラムの中で文字列を表すには、その文字列をダブルクオート(
"
)で囲みます。
ただし、文字列の中にダブルクオート(
"
)、シングルクオート(
'
)、バックスラッシュ(
\
)がある場合は、それぞれ
\"
,
\'
,
\\
と書きます。
次のプログラムは、変数 x に文字列"OK"を格納して、それを取り出すものです。
class StringTest { // 文字列のテスト public static void main (String[] args) { String x; x = "OK"; // 文字列を格納 System.out.println(x); } }
PS ...\Desktop\java1> & ... 'StringTest' OK PS ...\Desktop\java1>
2つの文字列を演算子
+
で結ぶと、文字列が連結されます。
一方だけが文字列の場合は、他方が文字列に変換されて連結されます。
次のプログラムは、2つの単語"All"と"right"、そしてスペースとピリオドも連結するものです。
class StringAppend { // 文字列の連結 public static void main (String[] args) { String word1, word2, sentence; word1 = "All"; word2 = "right"; sentence = word1 + " " + word2 + "."; // 文字列を連結 System.out.println(sentence); } }
PS ...\Desktop\java1> & ... 'StringAppend' All right. PS ...\Desktop\java1>
「
文字列1
」と「
文字列2
」を比較するとき、
文字列1
==
文字列2
と書いても思った通りになりません。
文字列のすべての文字が一致することを確かめるには、
文字列1.equals(文字列2)
と書きます。
プログラムの実行中にデータ入力を行うには、整数の場合は式
stdIn.nextInt()
を使い、実数の場合は式
stdIn.nextDouble()
を使いました。
文字列を入力するには、
nextString
ではなく、
stdIn.nextLine()
と書きます。
import java.util.Scanner; class StringInputTest { // 文字列入力のテスト public static void main (String[] args) { Scanner stdIn = new Scanner(System.in); String x; System.out.print("文字列を入力してください: "); x = stdIn.nextLine(); // 入力 System.out.println(x); } }
PS ...\Desktop\java1> & ... 'StringInputTest' 文字列を入力してください: All right. All right. PS ...\Desktop\java1>
「 文字列 」の文字数(長さ)は、式
文字列.length()
で取り出せます。 配列の要素数の取り出し方と似ていますが、配列の場合は括弧が付きません。 また、「 文字列 」の「 番号 」番目の文字を取り出すには、
文字列.charAt(番号)
とします。
次のプログラムは、文字列"All right."の中の文字を一つ一つ取り出して出力するものです。
class StringPrint { // 文字列の出力 public static void main (String[] args) { char ch; String str = "All right."; for (int i = 0; i < str.length(); i++) { // 文字数回繰り返す ch = str.charAt(i); // i番目の文字 System.out.println(ch); } } }
PS ...\Desktop\java1> & ... 'StringPrint' A l l r i g h t . PS ...\Desktop\java1>
なお、「 文字列 」の「 番号 」番目の文字を「 文字 」に変更しようとして、
文字列.charAt(番号) = 文字; // 間違い
と書いても、エラーになるだけです。 文字列は、一度作成すると変更はできません。 文字列を変更するには、文字列バッファというものを利用します。 ただし、文字列バッファは多少難しいので、この授業では取り上げません。 この授業では、文字列を変更するのではなく、文字列を作り直すことにします。
ここで、文字と文字列を扱うプログラムの例を紹介します。
以下のプログラムは、入力された文字列の中のスペース以外を、すべて星印(*)に置き換えるものです。 アルゴリズムの要点は、文字列の中の文字を一つずつ取り出し、それがスペースでないならば星印に置き換えることです。 ただし、入力された文字列 str は変更できないので、結果の文字列 result を用意します。 str から取り出した文字がスペースならば result にスペースを連結し、そうでないならば result に星印を連結します。
import java.util.Scanner; class StringHide { // スペース以外を星印にする public static void main (String[] args) { Scanner stdIn = new Scanner(System.in); char ch; String str, result; System.out.print("文字列を入力してください: "); str = stdIn.nextLine(); // 文字列を入力 result = ""; // 結果を空にする for (int i = 0; i < str.length(); i++) { // 文字列の長さだけ繰り返す ch = str.charAt(i); // i番目の文字 if (ch == ' ') { // 文字がスペースなら result = result + ch; // 文字を連結 } else { // そうでないなら result = result + '*'; // 星印を連結 } } System.out.println(result); } }
PS ...\Desktop\java1> & ... 'StringHide' 文字列を入力してください: Nice to meet you. **** ** **** **** PS ...\Desktop\java1>
以下のプログラムは、入力された文字列の中の数字以外を取り除くものです。 このプログラムでも、結果の文字列 result を用意し、入力された文字列 str から取り出した文字が数字ならば result にその数字を連結します。 数字の判定は、文字コードが'0'以上'9'以下としています。
import java.util.Scanner; class StringDigit { // 数字以外を取り除く public static void main (String[] args) { Scanner stdIn = new Scanner(System.in); char ch; String str, result; System.out.print("文字列を入力してください: "); str = stdIn.nextLine(); // 文字列を入力 result = ""; // 結果を空にする for (int i = 0; i < str.length(); i++) { // 文字列の長さだけ繰り返す ch = str.charAt(i); // i番目の文字 if ('0' <= ch && ch <= '9') { // 文字が数字なら result = result + ch; // 文字を連結 } } System.out.println(result); } }
PS ...\Desktop\java1> & ... 'StringDigit' 文字列を入力してください: 03(1234)5678 0312345678 PS ...\Desktop\java1>
入力された文字列からスペースを取り除くプログラムを作成してください。
import java.util.Scanner; class StringShorten { public static void main (String[] args) { Scanner stdIn = new Scanner(System.in); } }
PS ...\Desktop\java1> & ... 'StringShorten' 文字列を入力してください: This is a pen. Thisisapen. PS ...\Desktop\java1>
PS ...\Desktop\java1> & ... 'StringShorten' 文字列を入力してください: Is this a pen? Isthisapen? PS ...\Desktop\java1>
PS ...\Desktop\java1> & ... 'StringShorten' 文字列を入力してください: Yes, it is. Yes,itis. PS ...\Desktop\java1>
余力のある人は、スペースだけでなく、ピリオド(.)、コンマ(,)、疑問符(?)、感嘆符(!)も取り除いてください。
PS ...\Desktop\java1> & ... 'StringShorten2' 文字列を入力してください: This is a pen. Thisisapen PS ...\Desktop\java1>
PS ...\Desktop\java1> & ... 'StringShorten2' 文字列を入力してください: Is this a pen? Isthisapen PS ...\Desktop\java1>
PS ...\Desktop\java1> & ... 'StringShorten2' 文字列を入力してください: Yes, it is. Yesitis PS ...\Desktop\java1>
今日の演習13の答案(Javaプログラム)をメールで提出してください。 差出人は大学発行のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(7月4日)を明記してください。