熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

Java中利用散列表實現股票行情的查詢

2013-11-23 17:56:51  來源: Javascript 

   在java中提供了一個散列表類Hashtable利用該類我們可以按照特定的方式來存儲數據從而達到快速檢索的目的本文以查詢股票的收盤數據為例詳細地說明java中散列表的使用方法
  
  一散列表的原理
   散列表又稱為哈希表是線性表中一種重要的存儲方式和檢索方法在散列表中可以對節點進行快速檢索散列表算法的基本思想是由結點的關鍵碼值決定結點的存儲地址即以關鍵碼值k為自變量通過一定的函數關系h(稱為散列函數)計算出對應的函數值h(k)來將這個值解釋為結點的存儲地址將結點存入該地址中檢索時根據要檢索的關鍵碼值用同樣的散列函數計算出地址然後到相應的地址中去獲取要找的結點數據因此散列表有一個重要特征平均檢索的長度不直接依賴於表中元素的個數
   散列表最重要的一個指標是負載因子即散列表中結點數目與表中能容納的總結點數的比值它描述了散列表的飽和程度負載因子越接近內存的使用效率越高元素的尋找時間越長同樣負載因子越接近元素的尋找時間越短但內存的浪費越大Hashtable類缺省的負載因子為
  
  二Hashtable類
   Hashtable類為我們提供了散列表完整的功能可以讓我們很方便地構造和使用散列表查詢信息
   創建散列表對象
  
   Hashtable類的構造器主要有下面幾種形式
  
  public Hashtable(int initialCapacity float loadFactor)
  public Hashtable(int initialCapacity)
  public Hashtable()
  在本文的實例中我們使用了最簡單的一種
  Hashtable stockInfo = new Hashtable();
  
  
   充填數據
   當構造了Hashtable對象後我們就可以將數據填入該對象中以便以後查詢Hashtable類提供了put方法來完成數據的裝填其原型如下
  
   public synchronized Object put(Object key Object value)
  
   查詢數據
  
   查詢數據可以使用get方法其原型如下
  
   public synchronized Object get(Object key)
  
   其它常用的方法
  
  public int size();
  //返回散列表中的結點數目
  public boolean isEmpty();
  //判斷散列表是否為空
  public boolean containsValue(Object value);
  //判斷散列表中是否含有某值
  public synchronized boolean containsKey(Object key);
  //判斷散列表中是否含有某個結點
  public synchronized void clear();
  //清空整個散列表
  
  
  三StringTokenizer類
   StringTokenizer類的主要用途是將字符串以定界符為界分析為一個個的token(可理解為單詞)定界符可以自己指定
   構造器有下面幾種形式
  
  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() ;
  //判斷字符串中是否還有token
  public String nextToken();//
  StringTokenizer對象的下一個token
  
  
  四實例
   本文使用的股票行情為上海和深圳證券交易所的收盤行情文件名為hqsjtxt下面是文件中的一行數據
   宏圖高科
  
   下面是完整的源程序在JDK下使用javac編譯通過
  
  import javaio*;
  import javautil*;
  import javaawt*;
  import javaapplet*;
  import javaawtevent*;
  
  public class StockQuote extends Applet
  implements ActionListener
  {
  private static final File INFO_FILE =
  new File(hqsjtxt);
  private Hashtable stockInfo;
  TextField stockID;
  Button button;
  private String quoteidquotename;
  
  public void init()
  {
  add(new Label(股票代碼));
  stockID = new TextField();
  add(stockID);
  button = new Button(查詢);
  buttonaddActionListener(this);
  add(button);
  resize( );
  }
  
  public void start()
  {
  loadinfo();
  }
  
  protected boolean loadinfo()
  {
  String fileLine;
  StringTokenizer tokenize;
  String id;
  StringBuffer name;
  
  try {
  // 創建一個訪問數據文件的stream
  BufferedReader stockInput = new
  BufferedReader(new FileReader(INFO_FILE));
  // 創建Hashtable對象
  stockInfo = new Hashtable();
  // 每次從文件中讀一行數據
  while ((fileLine = stockInputreadLine()) != null) {
  // 將每一行數據分解為tokens
  tokenize = new StringTokenizer(fileLine);
  try {
  id = tokenizenextToken();
  // 創建一個放置股票信息的buffer
  name = new StringBuffer();
  while(tokenizehasMoreTokens()) {
  nameappend(tokenizenextToken());
  if (tokenizehasMoreTokens()) {
  nameappend();
  }
  }
  // 向Hashtable中充填記錄
  stockInfoput(idnametoString());
  } catch(NullPointerException excpt) {
  Systemerrprintln(充填數據時出錯: + excpt);
  } catch(NoSuchElementException excpt) {
  Systemerrprintln(無效的數據記錄 +
  in file: + excpt);
  }
  }
  stockInputclose();
  
  } catch(FileNotFoundException excpt) {
  Systemerrprintln(不能發現文件: + excpt);
  return false;
  } catch(IOException excpt) {
  Systemerrprintln(I/O故障: + excpt);
  return false;
  }
   return true;
  }
  
  protected String getQuote(String StockID)
  {
  String info;
  
  // 從Hashtable得到數據
  info = (String)stockInfoget(StockID);
  if (info != null)
  return info;
  else
  return 股票代碼錯誤!;
  }
  
  public void paint(Graphics g)
  {
  gdrawString(股票代碼+quoteid+: );
  gdrawString(股票名稱+前收+今開+最高
  +最低+收盤+交易量+交易金額 );
  gdrawString(quotename );
  }
  
  public void actionPerformed(ActionEvent ev)
  {
  String label = evgetActionCommand();
  if (labelequals(查詢))
  {
  quoteid = stockIDgetText();
  if(quoteid != null)
  quotename = getQuote(quoteid);
  else quotename = 請輸入股票代碼!;
  repaint();
  }
  }
  }
  
   由於java固有的安全方面的限制如果不使用SecurityPermission或數字簽名等措施java程序就不具有讀取本地文件的權限為了節省篇幅本文對此不再多做討論將編譯得到的StockQuoteclass放到一l文件中直接使用jdk提供的appletviewer其命令行的使用方法如下
  d:\jdk\bin\appletviewer l
  

From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25401.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.