单词频率统计

功能需求

  • 导入任意英文文本文件
  • 统计各单词出现的频率,并按照字典序输出
  • 将单词频率写入数据库
  • 实现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>

运行结果

  • 查询结果
    查询结果

  • 插入数据库
    在这里插入图片描述

  • 数据库
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值