單詞頻率統計
阿新 • • 發佈:2018-12-11
功能需求
- 匯入任意英文文字檔案
- 統計各單詞出現的頻率,並按照字典序輸出
- 將單詞頻率寫入資料庫
- 實現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>
執行結果
-
查詢結果
-
插入資料庫
-
資料庫