?? 0034.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("hqsj.txt");<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("股票代碼"));<br>
stockID = new TextField(6);<br>
add(stockID);<br>
button1 = new Button("查詢");<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("");<br>
}<br>
}<br>
// 向Hashtable中充填記錄<br>
stockInfo.put(id,name.toString());<br>
} catch(NullPointerException excpt) {<br>
System.err.println("充填數據時出錯: " + excpt);<br>
} catch(NoSuchElementException excpt) {<br>
System.err.println("無效的數據記錄 " +<br>
"in file: " + excpt);<br>
}<br>
} <br>
stockInput.close();<br>
<br>
} catch(FileNotFoundException excpt) {<br>
System.err.println("不能發現文件: " + excpt);<br>
return false;<br>
} catch(IOException excpt) {<br>
System.err.println("I/O故障: " + 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 "股票代碼錯誤!";<br>
}<br>
<br>
public void paint(Graphics g)<br>
{<br>
g.drawString("股票代碼"+quoteid+":" ,10,60);<br>
g.drawString("股票名稱"+"前收"+"今開"+"最高"<br>
+"最低"+"收盤"+"交易量"+"交易金額", 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("查詢"))<br>
{<br>
quoteid = stockID.getText();<br>
if(quoteid != null)<br>
quotename = getQuote(quoteid);<br>
else quotename = "請輸入股票代碼!";<br>
repaint();<br>
}<br>
}<br>
}<br>
<br>
---- 由于java固有的、安全方面的限制,如果不使用SecurityPermission或數字簽名等措施,java程序就不具有讀取本地文件的權限,為了節省篇幅,本文對此不再多做討論,將編譯得到的StockQuote.class放到一個.html文件中,直接使用jdk1.2提供的appletviewer,其命令行的使用方法如下: <br>
d:\jdk1.2\bin\appletviewer 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 + -