一、做一个词频统计程序,该程序具有以下功能
- 基本要求:
统计该英文文件中单词数和各单词出现的频率(次数),并能将单词按字典顺序输出。
可导入任意英文文本文件将单词及频率写入文件。 - 提高要求:完成基本要求的基础上,实现下述功能:
实现GUI界面。
将单词及频率写入数据库
二、程序源码(C++ 实现部分功能)
(1) 统计文本中单词个数
#include <iostream>
using namespace std;
/*
function:传入字符数组统计单词个数
return:单词个数count
*/
int count_word(char *str)
{
char temp[200];
//记录单词个数
int count = 0 ;
int state=0;
//指针
char *p =str;
int tempi =0;
//一直循环到字符串结尾
while(*p!='\0'){
if(*p==' ')
state = 0;
else if(state==0) //state == 1 zai 内部不加1
{
state=1;
count++;
}
p++;
temp[tempi] = *p;
}
return count;
}
int main(){
char str1[100];
puts("\n please enter a string");
gets(str1);
int sum=count_word(str1);
//输出文本单词个数
cout<<sum<<endl;
return 0;
}
(2) 如何将单词放到数组里?
- 解决方案:将字符数组转成字符串,再把字符串转成字符串数组
将字符串转成字符串数组
#include <sstream>
#include <iostream>
#include <string>
using namespace std;
void main()
{
string str="i love you";
stringstream sstr(str);
string str1[10];
string temp;
int i=0;
while(sstr>>temp)
{
str1[i++]=temp;
}
for(int j=0;j<i;++j)//str1 用于存储字符串
cout<<str1[j]<<endl;
}
(3) 如何对一个字符串数组进行统计单词出现的个数?
- 解决办法:我需要一个链表,然后开始循环字符串数组,拿数组中的字符串和链表中的字符串进行比较。相同则该单词权重自增,否则就将单词放在链表后面。
三、用Java实现功能(暂无GUI界面)
- 实现思路:获取字符串—字符串存入List—List排序—词频统计(用HashMap实现)
/*FileName: javaWordCalculter.java
*Function: 包含文本处理WordUtil类(统计词数,统计频数,按字母排序)
* SortWord类实现Comparator接口 以及测试类JavaWordCalculter
*/
package javaWordCalculater;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
/*
func:实现排序接口的SortWord类。按字母表排序。
*/
class SortWord implements Comparator{
@Override
public int compare(Object o1, Object o2) {
String sa = (String) o1;
String sb =(String) o2;
return sa.compareTo(sb);
}
}
/*
func:用于将文本转换成字符串数组,统计单词个数,各个单词的频数,以及按顺序排序
*/
class WordUtil {
private static List<String> str ;
private int total_word;
/*用于将文本转换成数组
*/
WordUtil(String s){
//字符串数组转化完成
String []st =s.split(" ");
str.toArray(st);
}
/*统计单词个数
*/
public int WordNumber(){
total_word = str.size();
return total_word;
}
/*单词排序
*/
public void WordSort(){
Collections.sort(str,new SortWord());
}
/*
将HashMap写入文件
*/
/*打印hashmap
*/
public void printHashMap(){
Set<Map.Entry<String, Double>> entry = map.entrySet();
for(Map.Entry<String, Double> e : entry) {
System.out.println("key:"+e.getKey()+"-value:"+e.getValue());
}
}
}
/**
*
* @author Administrator
*/
public class JavaWordCalculter {
public static void main(String[] args) {
//测试字符串"i loce you i love you "
WordUtil word = new WordUtil("i loce you i love you ");
//打印单词个数
System.out.println("文本中含有"+word.getWordNumber()+"个单词。");
//单词排序
word.WordSort();
//文本词频统计
word.Word_Frequency();
//打印
word.printHashMap();
}
}
四、GUI文件选择
/*
*GUI文件选择
*/
package nbgui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javafx.stage.FileChooser;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* 功能简介: 显示一个文件选择界面
* @author Administrator
*/
public class NBGui extends JFrame implements ActionListener {
JButton open=null;
public static void main(String[] args) {
new NBGui();
}
public NBGui(){
open=new JButton("open");
this.add(open);
this.setBounds(400, 200, 100, 100);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
open.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JFileChooser jfc=new JFileChooser();
/*setFileSelectionMode(int mode)
设置 JFileChooser,以允许用户只选择文件、只选择目录,或者可选择文件和目录。
mode参数:FILES_AND_DIRECTORIES 指示显示文件和目录。
FILES_ONLY 指示仅显示文件。
DIRECTORIES_ONLY 指示仅显示目录*/
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
jfc.showDialog(new JLabel(), "选择");
//返回选中的文件
File file=jfc.getSelectedFile();
if(file.isDirectory()){
System.out.println("文件夹:"+file.getAbsolutePath());
}else if(file.isFile()){
System.out.println("文件:"+file.getAbsolutePath());
//使用JavaRead_Write类构造函数。JavaRead_Write类中的file_path初始化开始
JavaRead_Write write_read_test =
new JavaRead_Write(file.getAbsolutePath());
//JavaRead_Write对象将测试中的hashMap写入文件中
write_read_test.writeObject();
}
System.out.println(file.getName());
}
}
五、文件读写操作
/*
* 功能机简介:读写文件
* 测试代码:HashMap<String, String> map = new HashMap< String, String>();
*/
package nbgui;
import java.awt.List;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.*;
import java.util.Properties;
/**
* 功能简介:读写文件
* @author Administrator
*/
public class JavaRead_Write {
//file_path 是制定文件路径,在JavaRead_Write的构造函数中初始化
private static String file_path;
JavaRead_Write(String s) {
file_path = s;
}
/*
func:写入指定文件
*/
public void writeObject() {
try {
//临时测试代码 hashMap
HashMap<String, String> map = new HashMap< String, String>();
map.put("name", "foolfish");
FileOutputStream outStream = new FileOutputStream(file_path);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);
objectOutputStream.writeObject(map);
//写入操作完成
outStream.close();
System.out.println("successful");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/*func: 从文件中读取数据进行初始化
*/
public void readObject() {
try {
FileInputStream freader = new FileInputStream(file_path);
ObjectInputStream si = new ObjectInputStream(freader);
//测试代码 hashMap
HashMap <String ,String > map ;
map = (HashMap < String, String >) si.readObject;
//读入成功
si.close();
System.out.println("The name is " + map.get("name"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
2017-3-28
- 更新内容:1)增添JavaBean类,优化软件结构采用
/*
* JavaBean类,数据实例
*/
package javawordcalculter;
import java.util.HashMap;
/**
*
* @author Administrator
*/
public class JavaBean {
//保存文件路径
public static String file_path ;
//HashMap
public static HashMap<String, String> map = new HashMap<>();
}
package javawordcalculter;
/*
* 功能机简介:读写文件
* 测试代码:HashMap<String, String> map = new HashMap< String, String>();
*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
/**
* 功能简介:读写文件
* @author Administrator
*/
public class JavaRead_Write {
//file_path 是制定文件路径,在JavaRead_Write的构造函数中初始化
private String file_path = JavaBean.file_path;
HashMap<String, String> map = JavaBean.map;
JavaRead_Write(String s) {
JavaBean.file_path = s;
file_path = JavaBean.file_path;
map = JavaBean.map;
}
/*
func:写入指定文件
*/
public void writeObject() {
try {
try (FileOutputStream outStream = new FileOutputStream(file_path)) {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);
objectOutputStream.writeObject(map);
//写入操作完成
}
System.out.println("successful");
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
/*func: 从文件中读取数据进行初始化
*/
public void readObject() throws ClassNotFoundException {
try {
//文件输入流
FileInputStream freader = new FileInputStream(file_path);
//对象写入流
ObjectInputStream si = new ObjectInputStream(freader);
map = (HashMap < String, String >)si.readObject();
//读入成功
si.close();
System.out.println("The name is " + map.get("name"));
} catch (FileNotFoundException e) {
}catch (IOException e) {
}
}
}
package javawordcalculter;
/*
*GUI文件选择
*/
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* 功能简介: 显示一个文件选择界面
* @author Administrator
*/
public class NBGui extends JFrame implements ActionListener {
JButton open=null;
public static void main(String[] args) {
new NBGui();
}
public NBGui(){
open=new JButton("open");
this.add(open);
this.setBounds(400, 200, 100, 100);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
open.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JFileChooser jfc=new JFileChooser();
/*setFileSelectionMode(int mode)
设置 JFileChooser,以允许用户只选择文件、只选择目录,或者可选择文件和目录。
mode参数:FILES_AND_DIRECTORIES 指示显示文件和目录。
FILES_ONLY 指示仅显示文件。
DIRECTORIES_ONLY 指示仅显示目录*/
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
jfc.showDialog(new JLabel(), "选择");
//返回选中的文件
File file=jfc.getSelectedFile();
if(file.isDirectory()){
System.out.println("文件夹:"+file.getAbsolutePath());
}else if(file.isFile()){
System.out.println("文件:"+file.getAbsolutePath());
//使用JavaRead_Write类构造函数。JavaRead_Write类中的file_path初始化开始
JavaBean.file_path = file.getAbsolutePath();
JavaRead_Write write_read_test = new JavaRead_Write(JavaBean.file_path);
//JavaRead_Write对象将测试中的hashMap写入文件中
write_read_test.writeObject();
}
System.out.println(file.getName());
}
}
持续更新中。。。。。。。。。。