1. 程式人生 > >單詞頻率統計

單詞頻率統計

功能需求

  • 匯入任意英文文字檔案
  • 統計各單詞出現的頻率,並按照字典序輸出
  • 將單詞頻率寫入資料庫
  • 實現GUI頁面

實現思路

讀檔案

  • 使用BufferedReader可以讀取一行,使用StringBuilder的append()將讀入的字串追加。

頻率統計

  • 將英文字串使用spilt()按空格分割,使用帶自然排序的TreeMap進行儲存,key存單詞,value存頻率。

存入資料庫

  • 使用c3p0連線池與DBUtils進行資料庫訪問與資料存入。

程式碼實現

  • 專案檔案結構 在這裡插入圖片描述

主頁面的實現(MainFrame.java)

package edu.xust.frame;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
 * 
* Title: MainFrame
* Description:主窗體類   
* @author jianglei  
* @date 2018年9月21日
 */
public class MainFrame extends JFrame {
	JButton jbOk, jbSave;//查詢、儲存按鈕
	JTextField jtfPath;//檔案路徑
	JTextArea jtaShow;//顯示單詞頻率
	JScrollPane jsp;//實現單詞頻率顯示的滾動條
	JLabel jl;
	JPanel jp1;
/**
 * 
 * Title: init</p>  

 * Description:初始化窗體
 */
	public void init() {
		jl = new JLabel("檔案路徑");
		jbOk = new JButton("查詢");
		jbSave = new JButton("儲存到資料庫");
		jtfPath = new JTextField(20);
		jtaShow = new JTextArea();
		jp1 = new JPanel();
		jsp = new JScrollPane(jtaShow);

	}

	public void set() {
		init();
		jp1.add(jl);
		jp1.add(jtfPath);
		jp1.add(jbOk);
		jsp.setSize(100,100);
		jtaShow.setSize(100, 100);
		//註冊事件
		jbOk.addActionListener(new OkListener(this));
		jbSave.addActionListener(new SaveListener(this));
		//新增元件
		this.add(jp1, BorderLayout.NORTH);
		this.add(jsp, BorderLayout.CENTER);
		this.add(jbSave, BorderLayout.SOUTH);
		this.setSize(400, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設定可關閉
		this.setVisible(true);//設定可見

	}

	public static void main(String[] args) {
		new MainFrame().set();
	}
}

從檔案讀入文字,並進行頻率統計(GetFile.java)

package edu.xust.service;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
/**
 * 
* Title: GetFile
* Description:獲取單詞頻率資訊   
* @author jianglei  
* @date 2018年9月21日
 */
public class GetFile {
static int count;//統計單詞個數
	String path;

	public GetFile(String path) {
		this.path = path;
	}
/**
 * 
 * Title: GetString</p>  
 * Description: 將文字單詞拼接成字串返回  
 * @return 單詞的字串
 * @throws IOException
 */
	private String GetString() throws IOException {
		BufferedReader bis = new BufferedReader(new FileReader(path));
		String str;
		StringBuilder sb = new StringBuilder();
		sb.append("單詞個數為"+count+"\n");
		while ((str = bis.readLine()) != null) {
			sb.append(str);
		}
		return sb.toString().toLowerCase();
	}
/**
 * 
 * Title: getCount</p>  
 * Description:對單詞進行分割,並統計頻率存入map   
 * @return 儲存單詞頻率資訊的map
 * @throws IOException
 */
	public Map getCount() throws IOException {
		TreeMap<String, Integer> map = new TreeMap<String, Integer>();
		String str = GetString();
		String[] word = str.split(" ");
		count = word.length;
		for (String wd : word) {//如果map中不存在單詞則在map中放入該單詞
			if (map.get(wd) == null)
				map.put(wd, 1);
			else//map中存在該單詞則將頻率加一
				map.put(wd, map.get(wd) + 1);
		}
		map.remove("");//將多餘的一個空字元去掉
		return map;
	}
	/**
	 * 
	 * Title: getCountSting</p>  
	 * Description: 可直觀感受的單詞頻率字串   
	 * @return 可直觀感受的單詞頻率字串
	 * @throws IOException
	 */
	public String getCountSting() throws IOException {
		StringBuilder sb = new StringBuilder();
		Map countMap = getCount();
		for(Object o: countMap.keySet())
			sb.append(o).append("->").append(countMap.get(o)).append("\n");
		return sb.toString();
	}

}

獲取DataSource(GetDataSources.java)

package edu.xust.dao;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
 * 
* Title: GetDataBase
* Description:單例模式建立  DataSource 
* @author jianglei  
* @date 2018年9月21日
 */
public class GetDataBase {
	private static DataSource dataSource = new ComboPooledDataSource();
	public static DataSource  getDataSource() {
		return dataSource;
	}
}

插入資料庫(WordDao.java)

package edu.xust.dao;

import java.sql.SQLException;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
/**
 * 
* Title: WordDao
* Description:解析map將資料存入資料庫   
* @author jianglei  
* @date 2018年9月21日
 */
public class WordDao {
	QueryRunner queryRunner = new QueryRunner(GetDataBase.getDataSource());
	public void add(Map map) throws SQLException {
		String sql;
		//遍歷插入資料庫
		for(Object o: map.keySet()) {
			sql = "insert into words values('"+o+"',"+Integer.parseInt(map.get(o).toString())+");";
			queryRunner.update(sql);
		}
	}
}

儲存到資料庫按鈕事件(SaveListener.java)

package edu.xust.frame;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.sql.SQLException;

import javax.swing.JOptionPane;

import edu.xust.dao.WordDao;
import edu.xust.service.GetFile;
/**
 * 
* Title: SaveListener
* Description:將查詢的單詞頻率資訊插入到資料庫   
* @author jianglei  
* @date 2018年9月21日
 */
public class SaveListener implements ActionListener {
	MainFrame mf;
	SaveListener(MainFrame mf){
		this.mf = mf;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==mf.jbSave) {
			try {
				WordDao wd = new WordDao();
				GetFile gf = new GetFile(mf.jtfPath.getText().trim());
				wd.add(gf.getCount());//插入資料庫
				JOptionPane.showMessageDialog(mf, "插入成功");//提示插入成功
			} catch (SQLException | IOException e1) {
				e1.printStackTrace();
			}
		}
	}

}

查詢按鈕的事件類(OkListener.java)

package edu.xust.frame;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;

import edu.xust.service.GetFile;

/**
 * 
* Title: OkListener
* Description:查詢按鈕的事件實現類   
* @author jianglei  
* @date 2018年9月21日
 */
public class OkListener implements ActionListener{
	MainFrame mf;
	OkListener(MainFrame mf ){
		this.mf = mf;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==mf.jbOk) {
			try {
				String path = mf.jtfPath.getText().trim();//從文字框擴地path內容
				GetFile file = new  GetFile(path);
				String countSting = file.getCountSting();//獲得單詞頻率資訊
				mf.jtaShow.setText(countSting);//將資訊顯示在文字框
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		
	}

}

c3p0連線池配置(c3p0-config.xml)

<?xml version ="1.0" encoding= "UTF-8" ?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
        <property name="user">root</property>
        <property name="password">root</property>
    </default-config>
</c3p0-config>

執行結果

  • 查詢結果 查詢結果

  • 插入資料庫 在這裡插入圖片描述

  • 資料庫 在這裡插入圖片描述