19 文字列とアルゴリズム

19.1 学習目標

19.2 ファイル入出力

タートルにはファイルの入出力のための便利なメソッドがついています.

リスト 19.2.1 FileIOSample.java
  1: /*
  2:  * ファイル読み書きのテスト
  3:  * Created on 2012/01/07
  4:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5:  */
  6: public class FileIOSample extends Turtle {
  7: 
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new FileIOSample(), args);
 11: 	}
 12: 
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 		saveToFile("a.txt", "ほげ");
 16: 		print(loadFromFile("a.txt"));
 17: 	}
 18: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、FileIOSampleプログラムが実行できます。

19.2.1 ファイル入出力の仕様

void saveToFile(String filename, String text)
textの内容をファイルに保存します.
String loadFromFile(String filename)
ファイルから文字列を読み込み,戻り値として返します.
String loadFromFile(String filename, String enc)
文字コードを指定して,ファイルを読み込みます.encの実引数例="Shift_JIS", "EUC-JP", "UTF-8"など.

19.3 作文遊び

ファイル読み込みとStringクラスライブラリを利用して,作文遊びのプログラムを書いてみましょう.

19.3.1 作文さん

作文するプログラムです.

リスト 19.3.1.1 SakubunSan.java
  1: /*
  2:  * 作文さん
  3:  * Created on 2012/01/07
  4:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5:  */
  6: public class SakubunSan extends Turtle {
  7: 
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new SakubunSan(), args);
 11: 	}
 12: 
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 		// 名詞を読み込む
 16: 		String nountxt = loadFromFile("Noun.txt");
 17: 		String[] nouns = nountxt.split("\n");
 18: 		int nounSize = nouns.length;
 19: 
 20: 		// 動詞を読み込む
 21: 		String verbtxt = loadFromFile("Verb.txt");
 22: 		String[] verbs = verbtxt.split("\n");
 23: 		int verbSize = verbs.length;
 24: 
 25: 		for (int i = 0; i < 10; i++) {
 26: 			// 作文する
 27: 			String noun1 = nouns[random(nounSize)];// 名詞1を選ぶ
 28: 			String noun2 = nouns[random(nounSize)];// 名詞2を選ぶ
 29: 			String verb = verbs[random(verbSize)];// 動詞を選ぶ
 30: 			print(noun1 + "が" + noun2 + "に" + verb);
 31: 		}
 32: 	}
 33: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、SakubunSanプログラムが実行できます。

入力するファイルは以下のような形式になっています.

Noun.txt

			
仕舞い
綺
洋裁
組打ち
畿内
明き家			
  .... (続く)

			

Verb.txt

			
引き込む
すきかえす
看取る
睦む
きこす			
  .... (続く)

			

19.3.2 反転さん

文字列を反転するプログラムです.

リスト 19.3.2.1 HantenSan.java
  1: /*
  2:  * 反転さん 反転文を作る
  3:  * Created on 2012/01/07
  4:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5:  */
  6: public class HantenSan extends Turtle {
  7: 
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new HantenSan(), args);
 11: 	}
 12: 
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 		print(makeHantenbun("こんにちは"));
 16: 		print(makeHantenbun("あいうえお"));
 17: 	}
 18: 
 19: 	String makeHantenbun(String bun) {
 20: 		int len = bun.length();
 21: 		String hantenbun = "";
 22: 		for (int i = len - 1; i >= 0; i--) {
 23: 			char c = bun.charAt(i);
 24: 			hantenbun = hantenbun + c;
 25: 		}
 26: 		return hantenbun;
 27: 	}
 28: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、HantenSanプログラムが実行できます。

19.3.3 判定さん

回文かどうかを判定するプログラムです.

リスト 19.3.3.1 HanteiSan.java
  1: /*
  2:  * 回文判定さん
  3:  * Created on 2012/01/07
  4:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5:  */
  6: public class HanteiSan extends Turtle {
  7: 
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new HanteiSan(), args);
 11: 	}
 12: 
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 		print(check("こんにちは"));
 16: 		print(check("あいうえお"));
 17: 		print(check("とまと"));
 18: 		print(check("たけやぶやけた"));
 19: 	}
 20: 
 21: 	boolean check(String bun) {
 22: 		String hantenbun = makeHantenbun(bun);
 23: 		boolean result = bun.equals(hantenbun);
 24: 		return result;
 25: 	}
 26: 
 27: 	String makeHantenbun(String bun) {
 28: 		int len = bun.length();
 29: 		String hantenbun = "";
 30: 		for (int i = len - 1; i >= 0; i--) {
 31: 			char c = bun.charAt(i);
 32: 			hantenbun = hantenbun + c;
 33: 		}
 34: 		return hantenbun;
 35: 	}
 36: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、HanteiSanプログラムが実行できます。

19.3.4 回文さん

回文を自動生成するプログラムです.

リスト 19.3.4.1 KaibunSan.java
  1: /*
  2:  * 回文さん
  3:  * Created on 2012/01/07
  4:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5:  */
  6: public class KaibunSan extends Turtle {
  7: 
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new KaibunSan(), args);
 11: 	}
 12: 
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 		// 名詞を読み込む
 16: 		String nountxt = loadFromFile("NounYomi.txt");
 17: 		String[] nouns = nountxt.split("\n");
 18: 		int nounSize = nouns.length;
 19: 
 20: 		// 動詞を読み込む
 21: 		String verbtxt = loadFromFile("VerbYomi.txt");
 22: 		String[] verbs = verbtxt.split("\n");
 23: 		int verbSize = verbs.length;
 24: 
 25: 		for (int i = 0; i < 1000000; i++) {
 26: 			// 作文し,回文ができたら表示する
 27: 			String noun1 = nouns[random(nounSize)];
 28: 			String verb = verbs[random(verbSize)];
 29: 			String bun1 = noun1 + verb;
 30: 			if (check(bun1)) {
 31: 				print(noun1 + "-" + verb);
 32: 			}
 33: 		}
 34: 
 35: 		print("finished");
 36: 	}
 37: 
 38: 	boolean check(String bun) {
 39: 		String hantenbun = makeHantenbun(bun);
 40: 		boolean result = bun.equals(hantenbun);
 41: 		return result;
 42: 	}
 43: 
 44: 	String makeHantenbun(String bun) {
 45: 		int len = bun.length();
 46: 		String hantenbun = "";
 47: 		for (int i = len - 1; i >= 0; i--) {
 48: 			char c = bun.charAt(i);
 49: 			hantenbun = hantenbun + c;
 50: 		}
 51: 		return hantenbun;
 52: 	}
 53: 
 54: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、KaibunSanプログラムが実行できます。

19.4 Webスクレイピング

19.4.1 WebからHTMLの読み込み

loadFromFile(String)の引数にURLを入れると,Webページを取ってくることが出来ます.

リスト 19.4.1.1 WebSample.java
  1: /*
  2:  * Webファイル読みこみのテスト
  3:  * Created on 2012/01/07
  4:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5:  */
  6: public class WebSample extends Turtle {
  7: 
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new WebSample(), args);
 11: 	}
 12: 
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 		print(loadFromFile("http://www.inf.shizuoka.ac.jp/", "UTF-8"));
 16: 	}
 17: }

ここ をクリックすると、プログラムをダウンロードできます。

(このプログラムはアプレット上では実行できません.)

実行結果は次のようになります.

			
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>静岡大学 情報学部</title>
  .... (続く)

			

19.4.2 読み込んだHTMLからのスクレイピング

Webページのソースが取得できたら,そこから好きな情報を抜き出しましょう

リスト 19.4.2.1 WeatherInfo.java
  1: /*
  2:  * 今日の浜松の天気
  3:  * Created on 2012/01/07
  4:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5:  */
  6: public class WeatherInfo extends Turtle {
  7: 
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new WeatherInfo(), args);
 11: 	}
 12: 
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 		String file = loadFromFile(
 16: 				"http://weather.yahoo.co.jp/weather/jp/22/5040.html", "UTF-8");
 17: 		int index1 = file.indexOf("><br>");
 18: 		String weather = file.substring(index1 + 5 + 13);
 19: 		int index2 = weather.indexOf("</td></tr>");
 20: 		weather = weather.substring(0, index2 - 13);
 21: 		System.out.println("今日の浜松の天気は「" + weather + "」です");
 22: 	}
 23: }

ここ をクリックすると、プログラムをダウンロードできます。

(このプログラムはアプレット上では実行できません.)

このプログラムでは,

こんなHTMLが取ってこれるので

(以前省略)....

        <table border=0 cellpadding=2 cellspacing=1 width=100%>
            <tr align=center><td><b>1月25日(水)</b></td></tr>
            <tr align=center><td>
               <img src="http://i.yimg.jp/images/weather/general/forecast/sun_clouds_st.gif" border="0" alt="晴時々曇"><br>
            晴時々曇
            </td></tr>
        </table>
			
....(以後省略)
			
このHTMLから,「晴時々曇」を抜き出すために,Stringクラスの indexOf()substring(int beginIndex) メソッドを利用しています.

実行結果は次のようになります.

今日の浜松の天気は「晴時々曇」です			
			

19.5 練習問題

19.5.1 ケンブリッジ変換

ある文章を入力すると,「ケンブリッジ変換」を自動的に行うプログラムを作ってみましょう.

「ケンブリッジ変換」参考URL

ファイル名は「Cambridge.java」とすること.

19.5.2 CSVファイルの読み込み

ここにある,ある中学校の成績データが記述されたCSV形式 のファイルを読み込み, 平均点を求めるプログラムを作ってみましょう.

CSVファイル:Comma Separated Valuesファイル,カンマ「,」でデータが区切られたファイル.

名前,数学,英語
佐藤,41,36
鈴木,46,73
田中,17,55
橋本,66,81
高橋,9,42
渡辺,52,68
伊藤,37,43
山本,99,48
ヒント

読み込んでからまず,split("\n")で各行に分割し,その後行毎にsplit(",")で各データを得ることが出来ます.

文字列型をint型に変換するには,int Integer.parseInt(String text)メソッドを使います. リファレンスはこちら

ファイル名は「CSV.java」とすること.

19.5.3 問題3:Webマッシュアップ

すきなサイトから,必要な情報のみを取ってくるプログラムを書いてみましょう.

複数のサイトから情報を取ってきて,合成できるとなお良い!

ファイル名は「Mashup.java」とすること.