一、做一个词频统计程序,该程序具有以下功能

  • 基本要求:
    统计该英文文件中单词数和各单词出现的频率(次数),并能将单词按字典顺序输出。
    可导入任意英文文本文件将单词及频率写入文件。
  • 提高要求:完成基本要求的基础上,实现下述功能:
    实现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());           
    }  

}

持续更新中。。。。。。。。。。