前々回、データ型の説明の中で、文字について触れました。 今日は、文字の使用例を紹介します。
文字型の変数 variable を宣言するには、
char variable;
と書きます。
プログラムの中で文字を表すには、その文字をシングルクオート(
'
)で囲みます。
ただし、ダブルクオート(
"
)は
'\"'
, シングルクオート(
'
)は
'\''
, バックスラッシュ(
\
)は
'\\'
と書きます。
次のプログラムは、変数 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*/ }
asiaa1:~/comp2b b08a001$ java CharacterTest A asiaa1:~/comp2b b08a001$
文字は、内部では整数として処理されます。 この、文字から整数への対応を文字符号と呼びます。 以下は、アルファベットの文字符号です。
文字 | 文字符号 | 文字 | 文字符号 | 文字 | 文字符号 | 文字 | 文字符号 |
---|---|---|---|---|---|---|---|
P | 80 | p | 112 | ||||
A | 65 | Q | 81 | a | 97 | q | 113 |
B | 66 | R | 82 | b | 98 | r | 114 |
C | 67 | S | 83 | c | 99 | s | 115 |
D | 68 | T | 84 | d | 100 | t | 116 |
E | 69 | U | 85 | e | 101 | u | 117 |
F | 70 | V | 86 | f | 102 | v | 118 |
G | 71 | W | 87 | g | 103 | w | 119 |
H | 72 | X | 88 | h | 104 | x | 120 |
I | 73 | Y | 89 | i | 105 | y | 121 |
J | 74 | Z | 90 | j | 106 | z | 122 |
K | 75 | k | 107 | ||||
L | 76 | l | 108 | ||||
M | 77 | m | 109 | ||||
N | 78 | n | 110 | ||||
O | 79 | o | 111 |
文字 character を文字符号にするには、式として
(int) character
と書きます。 逆に、文字符号 code を文字にするには、式として、
(char) code
と書きます。 character や code の部分が式の場合は、式を括弧で囲みます。
次のプログラムは、アルファベットの大文字をすべて出力するものです。 文字'A'の文字符号65から文字'Z'の文字符号90まで、一つ一つの文字符号を文字にしています。
/* 1*/ class CharacterCode { // 文字符号 /* 2*/ public static void main (String[] args) { /* 3*/ int i, codeA, codeZ; /* 4*/ char ch; /* 5*/ codeA = (int) 'A'; // 文字を文字符号にする /* 6*/ codeZ = (int) 'Z'; // 文字を文字符号にする /* 7*/ for (i = codeA; i <= codeZ; i++) { /* 8*/ ch = (char) i; // 文字符号を文字にする /* 9*/ System.out.print(ch); /* 10*/ } /* 11*/ System.out.println(); /* 12*/ } /* 13*/ }
asiaa1:~/comp2b b08a001$ java CharacterCode ABCDEFGHIJKLMNOPQRSTUVWXYZ asiaa1:~/comp2b b08a001$
文字同士を比較するには、関係演算子
==
を使います。
例えば、条件
'A' == 'A'
は成り立ち、条件
'A' == 'B'
は成り立ちません。
さらに、文字については、関係演算子
>
および
<
が使えます。
これは、文字符号の大小関係を意味します。
例えば、文字'A'の文字符号は65で、文字'B'の文字符号は66なので、条件
'A' < 'B'
は成り立ち、条件
'A' > 'B'
は成り立ちません。
関係演算子
>=
(以上)、
<=
(以下)、および
!=
(等しくない)も、整数のときと同じように使えます。
これまで、文字列は、
System.out.println("Good afternoon!");
のように、画面出力のときのみ使ってきました。 実は、文字列を変数に格納したり、文字列から文字を取り出したりできます。 ここでは、文字列の使い方について説明します。
文字列型の変数 variable を宣言するには、
String variable;
と書きます。
プログラムの中で文字列を表すには、その文字列をダブルクオート(
"
)で囲みます。
ただし、文字列の中にダブルクオート(
"
)、シングルクオート(
'
)、バックスラッシュ(
\
)がある場合は、それぞれ
\"
,
\'
,
\\
と書きます。
次のプログラムは、変数 x に文字列"Good afternoon!"を格納して、それを取り出すものです。
/* 1*/ class StringTest { // 文字列のテスト /* 2*/ public static void main (String[] args) { /* 3*/ String x; /* 4*/ x = "Good afternoon!"; // 文字列を格納 /* 5*/ System.out.println(x); /* 6*/ } /* 7*/ }
asiaa1:~/comp2b b08a001$ java StringTest Good afternoon! asiaa1:~/comp2b b08a001$
2つの文字列を演算子
+
で結ぶと、文字列が連結されます。
一方だけが文字列の場合は、他方が文字列に変換されて連結されます。
この機能を利用して、文字列でないデータ
x
を文字列に変換することができます。
つまり、
"" + x
と書いて、空列と
x
を連結するのです。
次のプログラムは、文字列"Good", " ", "afternoon", および"!"を連結するものです。
/* 1*/ class StringAppend { // 文字列の連結 /* 2*/ public static void main (String[] args) { /* 3*/ String str1, str2, str3; /* 4*/ str1 = "Good"; /* 5*/ str2 = "afternoon"; /* 6*/ str3 = str1 + " " + str2 + "!"; // 文字列を連結 /* 7*/ System.out.println(str3); /* 8*/ } /* 9*/ }
asiaa1:~/comp2b b08a001$ java StringAppend Good afternoon! asiaa1:~/comp2b b08a001$
文字列 string の文字数(長さ)は、式
string.length()
で取り出せます。 配列の要素数の取り出し方と似ていますが、配列の場合は括弧が付きません。 また、文字列 string の index 番目の文字を取り出すには、
string.charAt(index)
とします。
次のプログラムは、文字列"Good afternoon!"の中の文字を一つ一つ取り出して出力するものです。
/* 1*/ class StringPrint { // 文字列の出力 /* 2*/ public static void main (String[] args) { /* 3*/ int i; /* 4*/ char ch; /* 5*/ String str = "Good afternoon!"; /* 6*/ for (i = 0; i < str.length(); i++) { // 文字数回繰り返す /* 7*/ ch = str.charAt(i); // i番目の文字 /* 8*/ System.out.println(ch); /* 9*/ } /* 10*/ } /* 11*/ }
asiaa1:~/comp2b b08a001$ java StringPrint G o o d a f t e r n o o n ! asiaa1:~/comp2b b08a001$
なお、文字列 string の index 番目の文字を文字 character に変更しようとして、
string.charAt(index) = character; // 間違い
と書いても、エラーになるだけです。 文字列は、一度作成すると変更はできません。 文字列を変更するには、文字列バッファというものを利用します。 ただし、文字列バッファは多少難しいので、この授業では取り上げません。 この授業では、文字列を変更するのではなく、文字列を作り直すことにします。
次のプログラムは、アルファベットの大文字をすべて並べた文字列を生成するものです。 最初に、結果となる文字列 result を空列にしておき、アルファベットを一文字ずつ result に連結していきます。
/* 1*/ class StringGenerate { // 文字列の生成 /* 2*/ public static void main (String[] args) { /* 3*/ int i, codeA, codeZ; /* 4*/ char ch; /* 5*/ String result = ""; // 最初は空列 /* 6*/ codeA = (int) 'A'; /* 7*/ codeZ = (int) 'Z'; /* 8*/ for (i = codeA; i <= codeZ; i++) { /* 9*/ ch = (char) i; /* 10*/ result = result + ch; // 一文字ずつ連結 /* 11*/ } /* 12*/ System.out.println(result); /* 13*/ } /* 14*/ }
asiaa1:~/comp2b b08a001$ java StringGenerate ABCDEFGHIJKLMNOPQRSTUVWXYZ asiaa1:~/comp2b b08a001$
文字列
str1
と
str2
を比較するとき、
str1 == str2
と書いても思った通りになりません。
文字列のすべての文字が一致することを確かめるには、
str1.equals(str2)
と書きます。
整数123と文字列"123"は、見た目は同じですが、全く別のデータです。
整数
integer
を文字列に変換するには、上記の通り
"" + integer
とします。
逆に、文字列
string
を整数に変換するには、式として
Integer.parseInt(string)
と書きます。
ここで、以前紹介した、入力された整数をそのまま出力するプログラム
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class InputTest { /* 4*/ public static void main (String[] args) throws IOException { /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); /* 6*/ BufferedReader br = new BufferedReader(isr); /* 7*/ int x; /* 8*/ System.out.print("整数を入力してください: "); /* 9*/ x = Integer.parseInt(br.readLine()); // 入力 /* 10*/ System.out.println(x); /* 11*/ } /* 12*/ }
asiaa1:~/comp2b b08a001$ javac InputTest.java asiaa1:~/comp2b b08a001$ java InputTest 整数を入力してください: 100 100 asiaa1:~/comp2b b08a001$
を思い出してください。 このプログラムの9行目の意味が、ここでやっと明らかになります。
このプログラムを実行すると、
br.readLine()
の値は入力された文字列になります。
上記の場合では、文字列"100"です。
そして、
Integer.parseInt()
によって文字列"100"が整数100に変換されます。
最後に、この整数100が変数
x
に格納されるのです。
br.readLine()
は入力された文字列なので、
Integer.parseInt()
を使わなければ、入力された文字列をそのまま出力するプログラムになります。
ここで、文字と文字列を扱うプログラムの例を紹介します。
以下のプログラムは、入力された文字列の中の小文字を、すべて大文字に置き換えるものです。 アルゴリズムの要点は、文字列の中の文字を一つずつ取り出し、それが小文字ならば大文字に置き換えることです。 ただし、入力された文字列 str は変更できないので、結果の文字列 result を生成します。 小文字を大文字にするとき、大文字の文字符号と小文字の文字符号が32ずれていることを利用します。
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class StringCapitalize { // 文字列を大文字にする /* 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, code; /* 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 ('a' <= ch && ch <= 'z') { // 文字が小文字なら /* 16*/ code = (int) ch; // 文字符号 /* 17*/ ch = (char) (code - 32); // 32は大文字と小文字の差 /* 18*/ } /* 19*/ result = result + ch; // 文字を連結 /* 20*/ } /* 21*/ System.out.println(result); /* 22*/ } /* 23*/ }
asiaa1:~/comp2b b08a001$ java StringCapitalize 文字列を入力してください: Good afternoon! GOOD AFTERNOON! asiaa1:~/comp2b b08a001$
入力された文字列からスペースを取り除くプログラムを作成してください。
asiaa1:~/comp2b b08a001$ java StringShorten 文字列を入力してください: This is a pen. Thisisapen. asiaa1:~/comp2b b08a001$ java StringShorten 文字列を入力してください: Is this a pen? Isthisapen? asiaa1:~/comp2b b08a001$ java StringShorten 文字列を入力してください: Yes, it is. Yes,itis. asiaa1:~/comp2b b08a001$
余力のある人は、スペースだけでなく、ピリオド(.)、コンマ(,)、疑問符(?)、感嘆符(!)も取り除いてください。
asiaa1:~/comp2b b08a001$ java StringShorten2 文字列を入力してください: This is a pen. Thisisapen asiaa1:~/comp2b b08a001$ java StringShorten2 文字列を入力してください: Is this a pen? Isthisapen asiaa1:~/comp2b b08a001$ java StringShorten2 文字列を入力してください: Yes, it is. Yesitis asiaa1:~/comp2b b08a001$
今日の演習11の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(b08a001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(7月3日)を明記してください。