单词统计续

1步:输出单个文件中的前 N 个最常出现的英语单词。

功能1:输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。

功能2:输出出现次数最多的前 n 个单词, 

 例如, 提示统计统计前多少名:输入10。 就是输出最常出现单词的前 10 名。 当没有指明数量的时候,我们默认列出所有单词的频率。

2步:第二步:  支持 stop words

在一本小说里, 频率出现最高的单词一般都是 "a",  "it", "the", "and", "this", 这些词, 可以做一个 stop word 文件 (停词表), 在统计词汇的时候,跳过这些词。  我们把这个文件叫 "stopwords.txt" file.  

第三步:  想看看常用的短语是什么, 怎么办呢?  

先定义短语:"两个或多个英语单词, 它们之间只有空格分隔".   请看下面的例子:

  hello world   //这是一个短语

  hello, world //这不是一个短语

同一频率的词组, 按照字典序来排列。

//统计文章中的字母次数
package Word;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;

public class WordFind {

    public static void main(String[] args) {
        WordFind2[] word=new WordFind2[100];
        for(int i=0;i<100;i++) {
            word[i]=new WordFind2();
        }
        word[0].input(word);
        word[0].showAsc(word);
    }

}

class WordFind2{
    private char word;
    private int num;
    private static double time=0;
    public WordFind2() {
        word='0';
        num=1;
    }
    public static double getTime() {
        return time;
    }
    public char getWord() {
        return word;
    }
    public void setWord(char word) {
        this.word = word;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public void addnum() {
        num++;
    }
    public void input(WordFind2[] word) {
        String str;
        try {
            BufferedReader in=new BufferedReader(new FileReader("word.txt"));
            while((str = in.readLine())!=null) {
                change(str,word);
            }
            in.close();
        }
        catch (IOException e) {
            System.out.println("缓冲区错误");
    }
    }
    private void change(String str, WordFind2[] word2) {
        char[] s1=str.toCharArray();
        for(int i=0,j=0;i<s1.length;i++) {
            if((s1[i]>=65&&s1[i]<=90)||(s1[i]>=97&&s1[i]<=122)) {
                add(s1[i],word2);
                time++;
            }
        }
        
    }
    private void add(char s, WordFind2[] word2) {
        int j=0;
        boolean f=false;
        for(int i=0;i<word2.length;i++) {
            if(word2[i].getWord()=='0') {f=true;j=i;break;}
            if(s==word2[i].getWord()) {word2[i].addnum();break;}
        }
        if(f==true) {
            word2[j]=new WordFind2();
            word2[j].setWord(s);
        }
    }
    void show(WordFind2[] word2) {
        DecimalFormat df = new DecimalFormat( "0.0000");
        double b=0;
        for(int i=0;word2[i].getWord()!='0';i++) {
            b=word2[i].getNum()/word2[i].getTime();
            System.out.println(word2[i].getWord()+"	"+df.format(b));
        }
    }
    void showAsc(WordFind2[] word2) {
        WordFind2 word=new WordFind2();
        for(int i=0;word2[i].getWord()!='0';i++) {
            //if(word2[i].getWord().equals("")) continue;
            for(int j=i+1;word2[j].getWord()!='0';j++) {
                    if(word2[i].getNum()<word2[j].getNum()) {
                        word.setWord(word2[i].getWord());
                        word.setNum(word2[i].getNum());
                        word2[i].setWord(word2[j].getWord());
                        word2[i].setNum(word2[j].getNum());
                        word2[j].setWord(word.getWord());
                        word2[j].setNum(word.getNum());
                    }
                
            }
        }
        for(int i=0;word2[i].getWord()!='0';i++) {
            //if(word2[i].getWord().equals(""))continue;
            System.out.println(word2[i].getWord()+"	"+word2[i].getNum());//
        }
    }

}

MENU.java:

package Word;

import java.util.Scanner;

public class Menu {

    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        ShowMenu();
        int n=0;
        while((n=in.nextInt())!=4) {
            switch(n) {
            case 0:{
                WordFind2[] word=new WordFind2[100];
                for(int i=0;i<100;i++) {
                    word[i]=new WordFind2();
                }
                word[0].input(word);
                word[0].showAsc(word);
            };break;
            case 1:{
                WordFind3[] word=new WordFind3[999999];
                for(int i=0;i<word.length;i++) {
                    word[i]=new WordFind3();
                }
                word[0].input(word);
                word[0].showAsc(word);
            };break;
            case 2:{
                System.out.println("请输入n的数值");
                int n2=in.nextInt();
                WordFind3[] word=new WordFind3[999999];
                for(int i=0;i<word.length;i++) {
                    word[i]=new WordFind3();
                }
                word[0].input(word);
                word[0].showAsc(word,n2);
            };break;
            default:System.out.println("输入错误!请重新输入");
            }
            ShowMenu();
        }
        
    }
    
    public static void ShowMenu() {
        System.out.println("请选择:");
        System.out.println("0:输出全部的字母");
        System.out.println("1:输出全部的单词");
        System.out.println("2:输出前n项单词");
        System.out.println("3:退出");
    }

}
原文地址:https://www.cnblogs.com/huan-ch/p/11070174.html