○Hashtableを使った郵便番号検索アプレットの考察

そもそも新しいWindows10のブラウザではアプレットが動かないみたいですね

import java.util.*;
null オブジェクト以外であれば、どのオブジェクトでもキーや値に使用することができます。
Hashtable table = new Hashtable();
table.put("key","data");  値を入れる
String ans = (String)table.get("key"); keyで検索 値がなければ null が返ってきます。
table.remove("key"); キーと値の削除、キーがハッシュテーブルにない場合は、何も行いません。
int = table.size()  ハッシュテーブルにあるキーの数を返します。

Hashtableの郵便番号検索アプレットの考察
郵便番号テストデータはいいかげんに作成されています

郵便番号 → 住所
住所   → 郵便番号

5000000 → 岐阜県岐阜市以下に記載がない場合

のような感じで高速に検索できます。
検索にはhashtableを使っています。
htmlファイルに<applet code="test" archive="testlib.jar" width=200 height=200></applet>をいれて、
c:\>HtmlConverter
によりhtmlファイルをjava Plag-in 対応に処理しました。

jar cf testlib.jar *.class data.csv
によりjarファイルを作成しました。

data.csvファイルの内容の抜粋

03201,02001,0200133,イワテケン,モリオカシ,アオヤマ,岩手県,盛岡市,青山,0,0,1,0,0,0
03201,020,0200801,イワテケン,モリオカシ,アサギシ,岩手県,盛岡市,浅岸,0,1,0,0,0,0
03201,020,0200014,イワテケン,モリオカシ,アタゴシタ,岩手県,盛岡市,愛宕下,0,0,0,0,0,0
03201,020,0200013,イワテケン,モリオカシ,アタゴチヨウ,岩手県,盛岡市,愛宕町,0,0,0,0,0,0

このアプレットのソースです。

import java.io.*;
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.awt.event.*;
import java.net.*;


public class test extends Applet {
	TextField textField1;
	Label label1;
	Label statusLabel;
	String _FileName="data.csv";
	Hashtable table = new Hashtable();
	Thread tView;
	public void init(){
		setLayout(new BorderLayout());

		textField1 = new TextField("");
		this.add(textField1,"North");
		label1=new Label("",Label.LEFT);
		textField1.setEditable(false);
		textField1.setEnabled(false);
		this.add(label1,"Center");
		statusLabel=new Label("データファイルを読み出し中",Label.CENTER);
		this.add(statusLabel,"South");

//		textField1.addActionListener(new ActionListener(){
//			public void actionPerformed(ActionEvent e){
//				String str=textField1.getText();
//				String ans = (String)table.get(str);
//				System.out.println(ans);
//			}
//		});
		textField1.addTextListener(new TextListener(){
			public void textValueChanged(TextEvent e){
				String str=textField1.getText();
				String ans = (String)table.get(str);
			//	System.out.println(ans);
				if(ans!=null){
						label1.setText(ans);
					}else{
						label1.setText("該当なし");
					}
			}
		});
		repaint();
		tView = new Thread(){ 
			public void run(){ 
				try{
					while(true){
						label1.setText("読み込んだレコード:"+(int)(((double)table.size()/(double)239621)*100)+"%");
						Thread.sleep(100);
					}
				}catch(Exception e){}
			} 
		}; 
		tView.start(); 

		Thread t = new Thread(){ 
			public void run(){ 
				netRead();
				tView.interrupt();
				try{
					Thread.sleep(500);
				}catch(Exception e){}
				label1.setText("");
				statusLabel.setText("準備完了 レコード数:"+table.size());
				textField1.setEditable(true);
				textField1.setEnabled(true);
			} 
		}; 

		t.start();
		 
	}
	 public void paint(Graphics g) {

	} 
	
	public void netRead(){
		try{  
		//	URL u = new URL(getCodeBase()+_FileName);
			URL u= test.class.getResource(_FileName);//リソースの場合の読み込み

			InputStream is = u.openStream();
 			InputStreamReader isr = new InputStreamReader( is );
			BufferedReader br = new BufferedReader( isr );
 
			//ファイルからデータを読み込める間繰り返す
			while( br.ready() ){
				CSV(br.readLine());
				//System.out.println( br.readLine() ); //1行読み込んで表示する
			}
 
			//ストリームを閉じる
			br.close();
			isr.close();
			is.close();
 
		} catch ( Exception e ){
			System.out.println("err");
		}

	}
	public void CSV(String str){
				String data[]=new String[20];
				int j = 0;
				StringTokenizer stringTokenizerTest = new StringTokenizer(str, ",");
				while(stringTokenizerTest.hasMoreTokens()) {
					data[j]=stringTokenizerTest.nextToken().toString();
					j++;
				}
			//	System.out.println(data[2]+" : "+data[6]+data[7]+data[8]);
				table.put(data[2],data[6]+data[7]+data[8]);
				table.put(data[6]+data[7]+data[8],data[2]);
	}
	

}


▲トップページ > JAVA関連