研究帖7

 

 

 


作者へのメッセージ
研究課題 研究帖作成システム

研究課題 研究帖作成システム

 

 

N  カチャカチャッ ポン! カチャカチャッ ポン! カチャカチャッ ポン!  カチャカチャッ グシャッ!!「しまった!またキーを間違えた。 」

S 「博士、どうしたんですか? 」

N 「今日は調子が悪い。研究帖を書いているんだが、間違えてばかりだよ。そういえば この間、君が言っていた、研究帖を簡単に作るシステムは、出来てるのかい? 」

S 「まだなんです。javaは難しいですね。 」

N 「そうだなあ。エクセルVBAなら、自動記録で知らないメソッドも使えるしね。 ヘルプも使いやすいし。 」

S 「javaのAPI仕様書は、専門用語ばかりで何が書いてあるのか訳が わからないですよ。 」

N 「まあ、じきに慣れるよ。それに、君のKioのように、1度作ったクラスが 何回でもすぐ使えるじゃないか。そこが良い所だよ。ところで、どんなソフトを作るの? 」

S 「普通のテキスト文書を、研究帖のスタイルのhtml文書に変えるソフトですけど、 まず、ユーザーが書いたテキストを読んで、1行ずつ配列に入れます。 」

N 「それで? 」

S 「1行ずつ画面に表示します。ユーザーが特定のキーを押すと、ナイス博士「」、 BB君「」、そよ風さん「」と、言った人の名前が行に付けられます。他にも、1個のキーで、登録した画像やタグ を入れたり、行内の編集モードに入ったり出来るようにしたいんです。 」

N 「ああ、それはいいね。それから? 」

S 「最後に、行の始めと終わりに<p>と</p>を付けて、出力するわけです。 」

N 「なるほど、それなら今までやったプログラムの延長で、すぐ出来そうだね。 」

S 「後は、API仕様書が読めるかどうかです。 」

N 「何とかなるよ。がんばってくれよ。 」

S 「はい。 」

続く。

 

 

それから、3日が過ぎた。 

S 「ううーん、うまく行かないわ。 」

N 「やあ、そよ風さん、どうだね、研究は? 」

S 「いや、全然だめです。 」

N 「そうか。どこがわからないのかね? 」

S 「テキストの行数を数えて配列を作るんですけど、行数を読むだけの メソッドが見つからないんです。 」

N 「なあんだ。それなら、1行ずつ読みながら行数をカウントしたら良いじゃないか。 」

S 「だめなんですよ。それだと全部読み終わらないと配列が出来ないじゃないですか。 」

N 「うーん。 」

 

BB 「やあ、どうしたんですか? 」

N 「ああ、BB君、実はこういうわけなんだ。 」

BB 「なあんだ、そんなことですか。 」

N 「いい手が有るのかい? 」

BB 「簡単です。動的配列を作るんです。

N、S 「動的配列か!」「動的?動的配列って? 」

BB 「何だ、知らないのか。要素を増やせる配列だよ。 」

S 「どうやって作るの? 」

N 「それは... 」

S 「どうやって?知ってるんでしょ?

BB 「いや、まあ、... 」

S 「知ってるんならさっさと言いなさいよ! 」

BB 「いや、だからそれは、博士が詳しいよ! 」

N 「えっ! 」

BB 「分からないことは、僕より博士に聞いてくれよ。ここの所長なんだから! 」

N 「えっ!いやっ 」

S 「博士、どうやって作るんですか?

N 「えっ、はっはっは! 」

S 「はっはっは!、じゃなくて! 」

BB 「動的配列ですよ! 」

N 「ハッハッハ! 」

BB、S 「博士!」「笑って誤魔化さないで下さい! 」

N 「うわっはっはっは!! 」

BB、S 「博士!!」「博士ったら!!!」

N 「ぶわっはっはっは!!! ぶわっは!? ぶわっはっ?......そうだ!!ぶわっはだ!!

BB、S 「ど、どうしたんですか。」「急に大声出さないで下さい。 」

N 「ブワッハーだよ!ストリングブワッハーを作るんだよ!! 」

BB,S 「ス、ストリングブワッハー?」「何ですか、それ? 」

N StringBufferだよ!テキスト全部を巨大な文字列にしてStringBufferに入れるん だ! 」

S 「ええーっ、そんな馬鹿でかい文字列を作っても、どうしようもないですよ。 配列にしたいんだから。」

N 「大丈夫だよ。1行読むごとに、区切り文字を入れて文字列を増やしていくんだ。完成 したら、ストリングトークンナイザーで、区切り文字ごとに分けて配列にいれられるんだ。 」

S 「へえっ、そんなやり方があるんですか。 」

BB 「普通の文字列じゃだめなんですか? 」

N 「ただの文字列だと、無駄なガベージ・コレクションがたくさん出来るから、良くない そうだ。ネットサーフィンしていたら、いつも見ているホームページにそう書いてあったんだ。 」

BB 「へえっ、さすがですね。 」

S 「やっぱり、博士は何でも知ってますねえ。 」

N 「まあ、この程度は知ってて当然だよ。よし!この方針で行こう。さっそく研究だ! 」

BB 「で、動的配列は? 」

N 「ぶわっはっはっはっは!! 」

S 「もういいです!!! 」

続く 

 

 

ナイス博士 「どうだね、その後の研究は?」

そよ風さん「博士、研究帖を見て、何か気付きませんか?」

ナイス博士 「ほお、せりふにちゃんと名前がついて、さらに見やすくなったね。あっ!出来 たんだな!」

そよ風さん「そうです。プロトタイプですけど。」

ナイス博士 「どうやって使うの?」

そよ風さん「ただ、対話をテキストファイルに打ち込むだけです。そして、このタグ・ライターを動かすと、1行ずつ表示されるので、指定された番号を打ち込むだけで、誰のせりふか、後で書き込んだり、タグを入れたり、画像を挿入したり、出来るんです。」

ナイス博士 「へええ、すごいなあ。コードを見せてくれ。」

そよ風さん「これです!」

【プログラムC:\MyJava\TagWriter.java】**************************

import java.io.*;
import java.util.*;
import nice.*;  //クラスKioのパッケージ
class TRegister{
	String[] ssf;	
	String[] ss1;
	String[] ss2;
	
	
	String ssfi[]={"0","1","2","3","4","5","6","7","8","9"};	
	String ss1i[]={"<p>","<p><b>ナイス博士</b> 「","<p><b>BB君</b> 「","<p><b>そよ風さん</b>「",
	"<p><IMG height=56 src=\"nice.gif\" width=70></p>","<p><IMG height=56 src=\"bb.gif\" width=70></p>",
	"<p><IMG height=56 src=\"wind.gif\" width=70></p>","次に進む","前に戻る","終了"};
	String ss2i[]={"</p>","」</p>","」</p>","」</p>","","","","","",""};
	
	void initR(){
		ssf=ssfi;
		ss1=ss1i;
		ss2=ss2i;
		
		printR();
	}
	
	void printR(){
		System.out.println("\n********************************");
		
		for(int i=0;i<ssf.length;i++){
			System.out.println(ssf[i]+"------"+ss1[i]+ss2[i]);
		}
		System.out.println("********************************\n");
	}
}	
class ArrayReader{
	StringBuffer sb=new StringBuffer("");
	StringBuffer[] sba;
	StringTokenizer st;
	
	StringBuffer[] setA(String s){
		try{
			BufferedReader br=new BufferedReader(new FileReader(s));
			int il=0;
			String line;
			while((line=br.readLine())!=null){
				il+=1;
				sb.append(line + "<");
			}
			sba=new StringBuffer[il];
			br.close();
		}
		catch(Exception e){
			System.out.println("例外が発生し、ファイルの読み込みが出来ませんでした。"+e);
		}
		String sbs=sb.toString();
		return makeA(sbs);
	}
	
	StringBuffer[] makeA(String sb){
		st=new StringTokenizer(sb,"<");
		int i=0;
		
		while(st.hasMoreTokens()){
			sba[i]=new StringBuffer(st.nextToken());
			i+=1;
		}
		return sba;
	}
}
		
class ArrayWriter{
	void fWrite(StringBuffer[] sb,String sf){
		try{
			PrintWriter pr=new PrintWriter(new BufferedWriter(new FileWriter(sf)));
			for(int i=0;i<sb.length;i++){
				pr.println(sb[i]);
			}
			
			pr.close();
		}
		catch(Exception e){
			System.out.println("例外発生:保存は完了しませんでした。"+e);
		}
		System.out.println("保存完了");
	}
}
class TagWriter{
	static TRegister tr=new TRegister();
	
	public static void main(String[] args){
		tr.initR();
		Kio ki=new Kio();
		String sf=ki.ioSet("読み込むファイル名を打って下さい。");
		ArrayReader ar=new ArrayReader();
		StringBuffer[] sb2=ar.setA(sf);
		
		String sbo="";
		int i=0;
		do{
			tr.printR();
			System.out.println("入力: "+sb2[i]);
			sbo=ki.ioSet("番号を入力して下さい。",tr.ssf);
			switch(Integer.parseInt(sbo)){
			case 7:
				if(i<sb2.length-1)i+=1;
				break;
			case 8:
				if(i>0)i-=1;
				break;
			case 9:
				break;
			default:
				sb2[i].insert(0,tr.ss1[Integer.parseInt(sbo)]);
				sb2[i].append(tr.ss2[Integer.parseInt(sbo)]);
				System.out.println("出力: "+sb2[i]);
				if(i<sb2.length-1)i+=1;
				
				break;
			}
		}while(!sbo.equals("9"));
		
		for(int j=0;j<sb2.length;j++){
			System.out.println(sb2[j]);
		}
		String[] syn={"1","2"};
		sbo=ki.ioSet("この内容を保存しますか? 保存する:1   やめる:2",syn);
		
		if(Integer.parseInt(sbo)==1){
			sbo=ki.ioSet("保存するフィル名を拡張子付きで入力して下さい。");
			ArrayWriter aw=new ArrayWriter();
			aw.fWrite(sb2,sbo);
		}
	}
}
	

 

ナイス博士 「クラスKioも一緒に書いたほうが、分かりやすいよ。」

そよ風さん「そうですね。」

【プログラムC:\MyJava\nice\Kio.java】**************************

package nice;
import java.io.*;
/**
@author ナイス研究所
@version 1.0
Kio
メソッド
String ioSet(String s)
コマンドプロンプトにsを表示し、キー入力を返す。
使用例
Kio ki=new Kio();
String sf=ki.ioSet("処理するファイル名を拡張子付きで入力して下さい。");
*/
public class Kio{
	public String ioSet(String s){
		BufferedReader br=null;
		String str="";
		try{
			br=new BufferedReader(new InputStreamReader(System.in));
			System.out.println("");
			System.out.println(s);
			str=br.readLine();
		}
		catch(Exception e){
			System.out.println("例外:"+e);
		}
		return str;
	}
	
	public String ioSet(String s,String[] ss){
		boolean b1=false;
		String sf="";
		do{
			sf=this.ioSet(s);
			try{
				for(int i=0;i<ss.length;i++){
					if(sf.equals(ss[i])){
						b1=true;
					}
				}
			}
			catch(Exception e){
			}
		}while(!b1);
		return sf;
	}
}

そよ風さん「あら、BB君、そんなとこで何やってるの。」

BB君「いや、別に何にも....」

そよ風さん「ほら、見て、タグライターが出来たわよ。ちゃんと実用的なソフトよ。」

BB君「ふうん、良かったじゃないか。」

そよ風さん「なんか、機嫌悪いわね。こんな素晴らしいプログラムが出来たんだから、喜んでよ。」

BB君「別にたいした事ないよ。まあ、後で見てみるよ。」(去っていく。)

そよ風さん「ふふふっ、BB君たら、私の成功が面白くないのね!」

ナイス博士「こら、そういう事を言っちゃいけないよ。で、まだ完成じゃないのかい?」

そよ風さん「ええ、間違って番号を打ち込んだ時、すぐ修正できるようにしたいし、ストリングトークンナイザーに問題があるんです。」

ナイス博士「どういう事だね?」

そよ風さん「区切り文字です。文章で<を使うと、区切り文字になってしまうんです。」

ナイス博士「そうか。それじゃ、誰も絶対使わない文字にしないといけないな。」

そよ風さん「それなんですが、キーボードの文字で、誰も絶対使わない文字なんて、有るんでしょうか?」

ナイス博士「うっ!そっっ、そうか。だれも絶対使わない文字を、わざわざキーにつける訳が ないな。それじゃ、複数の、意味がない言葉の文字を区切り文字にしたらどうだい?」

BB君それじゃだめです。

ナイス博士うわっ、まだいたのか、bb君!なぜだね?」

BB君「ストリングトークンナイザーは、複数の文字を使うと、それぞれ単独の区切り文字にして、どれかが出るたびに区切ってしまうんです。」

ナイス博士「そうか、じゃ、作るしかないな。」

BB君「作るって?」

ナイス博士「複数の文字で、ストリングブワッハーを区切るクラスを作るんだ。」

BB君「出来るんですか?」

ナイス博士「出来るだろう?そよ風さん!」

そよ風さん「ええ!私がやるんですか?」

ナイス博士「もちろんだよ。ここまでやったんだから。それに、ストリングトークンナイザーは ストリングブワッハー型を扱えないから、1回ストリングに変えているだろう?それも無駄だか ら、ストリングブワッハーが直接区切れるようにしてくれ。」

BB君「博士、ストリングバッハーでいいですよ。」

(続く)

見学者の皆さんへ。ついに、タグライターが完成しました!興味がある方はコードを 見て下さい。このソフトは、私たち以外には使い道がないので、いつか、登録するタグを変更できるようにして、 しかもGUIで、「みんなのタグライター」と言うソフトを作るつもりです。いつになるか分かりませんが、 ご期待ください。(そよ風@ナイス研究所)

【プログラムC:\MyJava\TagWriter.java】**************************

import java.io.*;
import java.util.*;
import nice.*;

class TRegister{
	String[] ssf;	
	String[] ss1;
	String[] ss2;
	
	
	String ssfi[]={"0","1","2","3","4","5","6","7","8","9","10","11",""};	
	String ss1i[]={"<p>","<p><b>ナイス博士</b>「","<p><b>BB君</b>「","<p><b>そよ風さん</b>「",
	"<p><IMG height=56 src=\"nice.gif\" width=70></p>","<p><IMG height=56 src=\"bb.gif\" width=70></p>",
	"<p><IMG height=56 src=\"wind.gif\" width=70></p>","前に戻る","10行進む","","終了","最初に戻る",""};
	String ss2i[]={"","」</p>","」</p>","」</p>","","","","","","</p>","","",""};
	
	void initR(){
		ssf=ssfi;
		ss1=ss1i;
		ss2=ss2i;
		
		printR();
	}
	
	void printR(){
		System.out.println("\n********************************");
		
		for(int i=0;i<ssf.length;i++){
			System.out.println(ssf[i]+"------"+ss1[i]+ss2[i]);
		}
		System.out.println("********************************\n");
	}
}	

class ArrayReader{
	StringBuffer sb=new StringBuffer("");
	StringBuffer[] sba;
	StringTokenizer st;
	
	StringBuffer[] setA(String s){
		int il=0;
		try{
			BufferedReader br=new BufferedReader(new FileReader(s));
			String line;
			while((line=br.readLine())!=null){
				il+=1;
				sb.append(line + "#%&");
			}
			sba=new StringBuffer[il];
			br.close();
		}
		catch(Exception e){
			System.out.println("例外が発生し、ファイルの読み込みが出来ませんでした。"+e);
		}

		SBTokenizer sbt=new SBTokenizer();
		return sbt.sbSplit(sb,"#%&",il);
		
	}
	
	
}
		
class ArrayWriter{
	void fWrite(StringBuffer[] sb,String sf){
		try{
			PrintWriter pr=new PrintWriter(new BufferedWriter(new FileWriter(sf)));
			for(int i=0;i<sb.length;i++){
				pr.println(sb[i]);
			}
			pr.close();
			System.out.println("保存完了");
		}
		catch(Exception e){
			System.out.println("例外発生:保存は完了しませんでした。"+e);
		}
	}
}

class ASet{
	ASet(int ii[],int ia){
		for(int i=0;i<ii.length;i++){
			ii[i]=ia;
		}
	}
	
	void getA(){
	}
}


class TagWriter{
	static TRegister tr=new TRegister();
	
	public static void main(String[] args){
		tr.initR();
		Kio ki=new Kio();
		String sf=ki.ioSet("読み込むファイル名を打って下さい。");
		Db.pp(sf);
		ArrayReader ar=new ArrayReader();
		StringBuffer[] sb2=ar.setA(sf);
		int[] ia1=new int[sb2.length]; 
		ASet asr=new ASet(ia1,-1);
		
		String sbo="";
		int i=0;
		do{
			tr.printR();
			System.out.println(i+1+"行目入力: "+sb2[i]);
			sbo=ki.ioSet("番号を入力して下さい。行を進める時は、[Enter]だけ入力して下さい。",tr.ssf);
			if(sbo.equals("")){
				if(i<sb2.length-1)i+=1;
			}
			else{
				switch(Integer.parseInt(sbo)){
				case 7:
					if(i>0)i-=1;
					break;	
				case 8:
					if(i<sb2.length-10)i+=10;
					break;
				case 11:
					i=0;
					break;
				case 10:
					for(int j=0;j<sb2.length;j++){
						System.out.println(sb2[j]);
					}	
					String[] syn={"1","2","3"};
					sbo=ki.ioSet("この内容を保存しますか? 保存する:1   やめる:2    やりなおす:3",syn);
		
					if(Integer.parseInt(sbo)==1){
						String sfn=ki.ioSet("保存するフィル名を拡張子付きで入力して下さい。");
						ArrayWriter aw=new ArrayWriter();
						aw.fWrite(sb2,sfn);
					}
					if(Integer.parseInt(sbo)==3){
						sbo="100";
					}
					else{
						sbo="10";
					}
					break;
					
				default:
					int isb=Integer.parseInt(sbo);
					try{
						
						if(ia1[i]==-1){
							sb2[i].insert(0,tr.ss1[isb]);
							sb2[i].append(tr.ss2[isb]);
							System.out.println(i+1+"行目出力: "+sb2[i]);
							ia1[i]=isb;
						}
						else if(isb==ia1[i]){
							int i1=tr.ss1[isb].length();
							int i2=tr.ss2[isb].length();
							int i3=sb2[i].length();

							sb2[i].replace(i3-i2,i3,"");
							sb2[i].replace(0,i1,"");
							System.out.println("処理後"+sb2[i]);							
							ia1[i]=-1;
						}
						else{
							System.out.println("処理済です。"+ia1[i]+"を押せば元に戻ります。");
							i-=1;
						}
						if(i<sb2.length-1)i+=1;
						break;
					}
					catch(NullPointerException e){
					}
				}
			}
		}while(!sbo.equals("10"));
	}
}
		
class SBTokenizer{
	
	StringBuffer[] sbSplit(StringBuffer sb,String st,int index){
		StringBuffer[] sbo=new StringBuffer[index];
		int ik=0,ist=0,id=st.length(),i;
		for(i=0;i<index;i++){
			ik=sb.indexOf(st,ist);
			if(ik==-1){
				sbo[i]=new StringBuffer(sb.substring(ist,sb.length()));
				break;
			}
			sbo[i]=new StringBuffer(sb.substring(ist,ik));
			ist=ik+id;
		}
		return sbo;
	}
}	
	

************************************************************************************

 

 今回研究帖に出て来る、私がいつもネットサーフィンで行っているホームページとは、 「楽しいJava入門」です。

 難しい内容をユーモラスに分かりやすく教えてくれる、素晴らしいホームページで、これさえあれば、 入門書は買わなくていい!と思ったぐらいです。皆さんも、ぜひ行って見て下さい。(ナイスプログラム)

研究課題に戻る。