⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0034.htm

📁 Java语言是Internet上最热门的编程语言
💻 HTM
字号:
<html>

<head>
<title>新时代软件教程:操作系统 主页制作 服务器 设计软件 网络技术 编程语言 文字编辑</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋体}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1  {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
    <p align="center"><big><strong>Java中利用散列表实现股票行情的查询</strong></big></p>

<div align="right">---(文/杨绍方)</div>

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

  </table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -