---- 在java中,提供了一个散列表类Hashtable,利用该类,我们可以按照特定的方式来存储数据,从而达到快速检索的目的。本文以查询股票的收盘数据为例,详细地说明java中散列表的使用方法。
---- 散列表最重要的一个指标是负载因子,即散列表中结点数目与表中能容纳的总结点数的比值,它描述了散列表的饱和程度,负载因子越接近1.0,内存的使用效率越高,元素的寻找时间越长,同样,负载因子越接近0.0,元素的寻找时间越短,但内存的浪费越大。Hashtable类缺省的负载因子为0.75.
---- 1.创建散列表对象
---- Hashtable类的构造器主要有下面几种形式:
public Hashtable(int initialCapacity, float loadFactor);public Hashtable(int initialCapacity);public Hashtable();在本文的实例中,我们使用了最简单的一种:Hashtable stockInfo = new Hashtable();
---- 2.充填数据---- 当构造了Hashtable对象后,我们就可以将数据填入该对象中,以便以后查询。Hashtable类提供了put方法来完成数据的装填,其原型如下:
---- public synchronized Object put(Object key, Object value);
---- 3.查询数据
---- 查询数据可以使用get方法,其原型如下:
---- public synchronized Object get(Object key)
---- 4.其它常用的方法
public int size();//返回散列表中的结点数目public boolean isEmpty();//判断散列表是否为空public boolean containsValue(Object value);//判断散列表中是否含有某值public synchronized boolean containsKey(Object key);//判断散列表中是否含有某个结点public synchronized void clear();//清空整个散列表
---- 构造器有下面几种形式:
public StringTokenizer(String str, String delim, boolean returnTokens);public StringTokenizer(String str, String delim);public StringTokenizer(String str);其中,str为需分析的字符串,delim为定界符,Tokens描述是否将定界符作为一个token。
---- 其它常用的方法有:public boolean hasMoreTokens() ;//判断字符串中是否还有tokenpublic String nextToken();// StringTokenizer对象的下一个token
---- 600122宏图高科 18.90 18.80 18.90 18.20 18.27 3155 582.96
---- 下面是完整的源程序,在JDK1.2下使用javac编译通过。
import java.io.*; import java.util.*;import java.awt.*;import java.applet.*;import java.awt.event.*;public class StockQuote extends Applet implements ActionListener{private static final File INFO_FILE = new File("hqsj.txt");private Hashtable stockInfo;TextField stockID;Button button1;private String quoteid,quotename;public void init(){add(new Label("股票代码"));stockID = new TextField(6);add(stockID);button1 = new Button("查询");button1.addActionListener(this);add(button1);resize(500, 300);}public void start(){loadinfo();}protected boolean loadinfo(){String fileLine;StringTokenizer tokenize;String id;StringBuffer name;try {// 创建一个访问数据文件的streamBufferedReader stockInput = new BufferedReader(new FileReader(INFO_FILE));// 创建Hashtable对象stockInfo = new Hashtable();// 每次从文件中读一行数据while ((fileLine = stockInput.readLine()) != null) {// 将每一行数据分解为tokens.tokenize = new StringTokenizer(fileLine);try {id = tokenize.nextToken();// 创建一个放置股票信息的buffername = new StringBuffer();while(tokenize.hasMoreTokens()) {name.append(tokenize.nextToken());if (tokenize.hasMoreTokens()) {name.append("");}}// 向Hashtable中充填记录stockInfo.put(id,name.toString());} catch(NullPointerException excpt) {System.err.println("充填数据时出错: " + excpt);} catch(NoSuchElementException excpt) {System.err.println("无效的数据记录 " +"in file: " + excpt);}} stockInput.close();} catch(FileNotFoundException excpt) {System.err.println("不能发现文件: " + excpt);return false;} catch(IOException excpt) {System.err.println("I/O故障: " + excpt);return false;} return true;}protected String getQuote(String StockID){String info;// 从Hashtable得到数据info = (String)stockInfo.get(StockID);if (info != null)return info;elsereturn "股票代码错误!";}public void paint(Graphics g){g.drawString("股票代码"+quoteid+":" ,10,60);g.drawString("股票名称"+"前收"+"今开"+"最高"+"最低"+"收盘"+"交易量"+"交易金额", 10, 90);g.drawString(quotename, 10, 120);}public void actionPerformed(ActionEvent ev){String label = ev.getActionCommand();if (label.equals("查询")){quoteid = stockID.getText();if(quoteid != null)quotename = getQuote(quoteid);else quotename = "请输入股票代码!";repaint();}}}
---- 由于java固有的、安全方面的限制,如果不使用SecurityPermission或数字签名等措施,java程序就不具有读取本地文件的权限,为了节省篇幅,本文对此不再多做讨论,将编译得到的StockQuote.class放到一个.html文件中,直接使用jdk1.2提供的appletviewer,其命令行的使用方法如下:d:/jdk1.2/bin/appletviewer StockQuote.html