[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

コンピュータIIB(Javaプログラミング入門)第11回

目次
11.1 文字列
11.1.1 文字列の操作
11.1.2 文字列バッファ
11.1.3 整数と文字列
11.2 文字と文字列
11.2.1 文字の操作
11.2.2 文字列の使用例
11.3 演習11
11.4 レポート課題
11.5 参考文献
索引
文字列バッファ  

11.1 文字列

11.1.1 文字列の操作

これまで、文字列は

int result = 12345679 * 9;
System.out.println("result = " + result);

のように画面出力のときのみ使ってきました。 実は、文字列は、組み込みのクラスであるStringクラスのインスタンスです。 文字列はよく使われるので、便利な機能がいくつか用意されています。

まず、文字列では、コンストラクタを使わなくてもインスタンスが生成できます。 コンストラクタを用いて

String s = new String();
s = "Good";

String s = new String("Good");

などと書かなくても、

String s = "Good";

でよいのです。

また、文字列では、演算子 + が使えます。 これは、文字列を連結します。

String s1 = "Good";
String s2 = "morning!";
String s3 = s1 + " " + s2;

とすると、 s3 には文字列 "Good morning!" が格納されます。 文字列と数を演算子 + で結ぶと、数が文字列に変換されてから連結されます。

次のプログラムでは、 s2 には文字列 "result = 111111111" が格納されます。

/*  1*/ class StringTest {
/*  2*/     public static void main (String[] args) {
/*  3*/         int result = 12345679 * 9;
/*  4*/         String s1 = "result = ";
/*  5*/         String s2 = s1 + result; // 連結
/*  6*/         System.out.println(s2);
/*  7*/     }
/*  8*/ }
asiaa1:~/comp2b b08a001$ java StringTest
result = 111111111
asiaa1:~/comp2b b08a001$

Stringクラスのメソッドで重要なものは以下の通りです。

char charAt (int i)
そのインスタンスの i 番目の文字を返す。
boolean equals (String s)
そのインスタンスと文字列 s の内容が同じならば true を返す。 そうでなければ false を返す。
int length ()
そのインスタンスの文字数を返す。
static String valueOf (boolean b)
真理値 b を文字列に変換して返す。
static String valueOf (char c)
文字 c を文字列に変換して返す。
static String valueOf (int i)
整数 i を文字列に変換して返す。

なお、これらのメソッドを呼び出すときには、 charint などは書きません。 また、 static と書いてなければインスタンスメソッド、書いてあればクラスメソッドです。 インスタンス instance に対してインスタンスメソッド methodname を呼び出すには、

instance.methodname(argument...)

と書きます。 クラス classname のクラスメソッド methodname を呼び出すには、

classname.methodname(argument...)

と書きます。

11.1.2 文字列バッファ

文字列、すなわちStringクラスのインスタンスは、一度生成されるとその内容は変更できません。 文字列 "Good morning!" の mor を eve に置き換えることができないのです。

文字列の内容を変更するためには、文字列バッファというものを用います。 文字列バッファstring buffer ) とは、組み込みのクラスStringBufferのインスタンスのことです。 文字列バッファに対しては、文字の置き換え、追加、挿入などができます。 文字列の内容を変更するには、いったん文字列を文字列バッファに変換し、文字列バッファの内容を変更したあと、文字列バッファを文字列に変換すればよいのです。

文字列を文字列バッファに変換するには、StringBufferクラスのコンストラクタを用います。 逆に、文字列バッファを文字列に変換するには、インスタンスメソッド toString を呼び出します。

次のプログラムは、文字列バッファを利用して、文字列 "Good morning!" の mor を eve に置き換えるものです。

/*  1*/ class StringBufferTest {
/*  2*/     public static void main (String[] args) {
/*  3*/         String str = "Good morning!";
/*  4*/         StringBuffer sb = new StringBuffer(str); // 文字列を文字列バッファに変換
/*  5*/         sb.setCharAt(5, 'e'); // 5番目の文字を置き換える
/*  6*/         sb.setCharAt(6, 'v'); // 6番目の文字を置き換える
/*  7*/         sb.setCharAt(7, 'e'); // 7番目の文字を置き換える
/*  8*/         String result = sb.toString(); // 文字列バッファを文字列に変換
/*  9*/         System.out.println(result);
/* 10*/     }
/* 11*/ }
asiaa1:~/comp2b b08a001$ java StringBufferTest
Good evening!
asiaa1:~/comp2b b08a001$

ここで、インスタンスメソッド setCharAt ( i , c )は、そのインスタンスの i 番目の文字を c に置き換えるものです。

StringBufferクラスの重要なメソッドは以下の通りです。

StringBuffer append (String s)
そのインスタンスに文字列 s を追加する。
StringBuffer append (char c)
そのインスタンスに文字 c を追加する。
char charAt (int i)
そのインスタンスの i 番目の文字を返す。
StringBuffer insert (int i, String s)
そのインスタンスの i 番目の位置に文字列 s を挿入する。
StringBuffer insert (int i, char c)
そのインスタンスの i 番目の位置に文字 c を挿入する。
int length ()
そのインスタンスの文字数を返す。
void setCharAt (int i, char c)
そのインスタンスの i 番目の文字を文字 c に置き換える。
String toString ()
そのインスタンスを文字列に変換して返す。

11.1.3 整数と文字列

組み込みのIntegerクラスでは、整数( int 型)の変換に関するメソッドがいくつか提供されています。 その中では、以下のものが重要です。

static int parseInt (String s)
文字列 s を整数( int 型)に変換して返す。
static String toString (int i)
整数( int 型) i を文字列に変換して返す。

ここで、以前紹介した、入力された整数をそのまま出力するプログラム

/*  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" です。 そして、クラスメソッド parseInt によって文字列 "100" が整数 100 に変換されます。 最後に、この整数 100 が変数 x に格納されるのです。


11.2 文字と文字列

11.2.1 文字の操作

以前説明した通り、文字は内部では整数として処理されます。 したがって、文字が等しいかどうかは、整数と同様に関係演算子 == を用いて表します。 また、 >< などは、文字符号の大小関係を意味します。

例えば、

if (c == ' ') {
    ...
}

は、文字 c がスペースならば…だし、

if (('A' <= c) && (c <= 'Z')) {
    ...
}

は、文字 c がアルファベットの大文字ならば…です。

文字を1増加させることは、文字符号を1増加させることになります。 ただし、このことを

c = c + 1;

と書くと、エラーになります。 これは、足し算によって右辺が整数( int 型)と見なされるからです。 整数を文字に変換するには、

c = (char) (c + 1);

と書きます。

逆に、整数と見なされることを利用することもできます。 文字 c が数字である場合、式

c - '0'

はその数字の表す数になります。 例えば、式 '3' - '0' の値は3になります。

次のプログラムは、アルファベットの大文字をすべて出力するものです。

/*  1*/ class CharacterTest {
/*  2*/     public static void main (String[] args) {
/*  3*/         char c;
/*  4*/         for (c = 'A'; c <= 'Z'; c = (char) (c + 1)) {
/*  5*/             System.out.print(c);
/*  6*/         }
/*  7*/         System.out.println();
/*  8*/     }
/*  9*/ }
asiaa1:~/comp2b b08a001$ java CharacterTest
ABCDEFGHIJKLMNOPQRSTUVWXYZ
asiaa1:~/comp2b b08a001$

文字に関するメソッドは、組み込みのクラスであるCharacterクラスで提供されています。 この中で重要なものは以下の通りです。

static boolean isDigit (char c)
文字 c が数字ならば true を返す。 そうでなければ false を返す。
static boolean isLowerCase (char c)
文字 c がアルファベットの小文字ならば true を返す。 そうでなければ false を返す。
static boolean isSpace (char c)
文字 c がホワイトスペース(スペース、水平タブ、改行など)ならば true を返す。 そうでなければ false を返す。
static boolean isUpperCase (char c)
文字 c がアルファベットの大文字ならば true を返す。 そうでなければ false を返す。
static char toLowerCase (char c)
文字 c がアルファベットの大文字ならば、それを小文字に変換して返す。 そうでなければそのまま返す。
static char toUpperCase (char c)
文字 c がアルファベットの小文字ならば、それを大文字に変換して返す。 そうでなければそのまま返す。

11.2.2 文字列の使用例

ここで、文字と文字列を扱うプログラムの例を、いくつか紹介します。

最初のプログラムは、入力された文字列の中の小文字を、すべて大文字に置き換えるものです。 アルゴリズムの要点は、文字列の中の文字を一つずつ取り出し、それが小文字ならば大文字に置き換えることです。 ただし、文字列の変更はできませんので、いったん文字列バッファに変換してから置き換えを行い、再び文字列に変換します。

プログラムでは、12行目で入力された文字列を変数 str に格納します。 13行目で文字列 str を文字列バッファ sb に変換します。 20行目で文字列バッファ sb を文字列 result に変換します。

14行目の長さを求める length , 15行目と16行目の文字を取り出す charAt , 17行目の文字を置き換える setCharAt , 20行目の文字列へ変換する toString は、すべて文字列バッファのインスタンスメソッドなので、 sb . methodname (...)という形式で呼び出します。

15行目の小文字かどうかを判定する isLowerCase と、16行目の大文字にする toUpperCase は、Characterクラスのクラスメソッドなので、Character. methodname (...)という形式で呼び出します。

/*  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;
/*  8*/         char ch;
/*  9*/         String str, result;
/* 10*/         StringBuffer sb;
/* 11*/         System.out.print("文字列を入力してください: ");
/* 12*/         str = br.readLine(); // 文字列を入力
/* 13*/         sb = new StringBuffer(str); // 文字列を文字列バッファに変換
/* 14*/         for (i = 0; i < sb.length(); i++) { // 文字列バッファの長さだけ繰り返す
/* 15*/             if (Character.isLowerCase(sb.charAt(i))) { // i番目の文字が小文字なら
/* 16*/                 ch = Character.toUpperCase(sb.charAt(i)); // i番目の文字を大文字にして
/* 17*/                 sb.setCharAt(i, ch); // i番目の文字を置き換える
/* 18*/             }
/* 19*/         }
/* 20*/         result = sb.toString(); // 文字列バッファを文字列に変換
/* 21*/         System.out.println(result);
/* 22*/     }
/* 23*/ }
asiaa1:~/comp2b b08a001$ java StringCapitalize
文字列を入力してください: Good afternoon!
GOOD AFTERNOON!
asiaa1:~/comp2b b08a001$

次のプログラムは、入力された文字列のすべての文字の後にスペースを挿入するものです。 アルゴリズムの要点は、始めに空の文字列バッファを用意し、文字列の文字を一つずつ取り出して、その文字とスペースを文字列バッファに追加することです。

プログラムでは、9行目で空の文字列バッファを変数 sb に格納します。 12行目の長さを求める length と、13行目の文字を取り出す chatAt は、文字列のインスタンスメソッドです。 13行目と14行目の文字を追加する append と、16行目の文字列に変換する toString は、文字列バッファのインスタンスメソッドです。

/*  1*/ import java.io.*;
/*  2*/ 
/*  3*/ class StringWiden {
/*  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*/         String str, result;
/*  9*/         StringBuffer sb = new StringBuffer(""); // 空の文字列バッファ
/* 10*/         System.out.print("文字列を入力してください: ");
/* 11*/         str = br.readLine();
/* 12*/         for (i = 0; i < str.length(); i++) {
/* 13*/             sb.append(str.charAt(i)); // i番目の文字を追加
/* 14*/             sb.append(' '); // スペースを追加
/* 15*/         }
/* 16*/         result = sb.toString();
/* 17*/         System.out.println(result);
/* 18*/     }
/* 19*/ }
asiaa1:~/comp2b b08a001$ java StringWiden
文字列を入力してください: ABCDE
A B C D E 
asiaa1:~/comp2b b08a001$

11.3 演習11

入力された文字列からスペースを取り除くプログラムを作成してください。

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 StringShorten
文字列を入力してください: This is a pen.
Thisisapen
asiaa1:~/comp2b b08a001$ java StringShorten
文字列を入力してください: Is this a pen?
Isthisapen
asiaa1:~/comp2b b08a001$ java StringShorten
文字列を入力してください: Yes, it is.
Yesitis
asiaa1:~/comp2b b08a001$

11.4 レポート課題

今日の演習11の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(b08a001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(6月27日)を明記してください。


11.5 参考文献


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2008年6月27日更新
小西 善二郎 <konishi@cis.twcu.ac.jp>
Copyright (C) 2008 Zenjiro Konishi. All rights reserved.