对于对英文文本文档进行分析,统计文本里面单词出现最多的10个单词

 分析及查询资料      具体设计 具体编码 测试 复测  报告
 9:00~10:30 10:30~12:00 14:00~17:30 18:30~21:30 次日9:00~10:20  14:00~16:00

      上课时刚拿到这个题目的时候,对于该题目已然明确分析出个大的部分内容:读取文件、读取文件内英文单词、对单词进行分析统计、输出出现次数最多的10个单词。

对于读取文件和文件内英文单词,创建输入流:

public class Test {
    private static String path = "English.txt";

    public static void main(String[] args) throws IOException {
        
        File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);

        int thechar;
        StringBuffer sb = new StringBuffer();
        HashMap<String, Integer> wordList = new HashMap<String, Integer>();

 对输入流里面的单词全部导入HashMap中,并且导入到List集合中

        while ((thechar = isr.read()) != -1) {
            char letter = (char) thechar;
            if ((letter >= 'a' && letter <= 'z')
                    || (letter >= 'A' && letter <= 'Z')) {
                sb.append(letter);
            } else if (sb.length() != 0) {
                String theword = new String(sb);
                if (wordList.containsKey(theword)) {
                    wordList.put(theword, wordList.get(theword) + 1);
                } else {
                    wordList.put(theword, 1);
                }
                sb.delete(0, sb.length());
            }
        }
        isr.close();
        
            List<Map.Entry<String, Integer>> words = new ArrayList<Map.Entry<String, Integer>>(
                wordList.entrySet());
              Collections.sort(words, new Comparator<Map.Entry<String, Integer>>() {

            @Override
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2) {
                return -(o1.getValue() - o2.getValue());
            }
        });

最后选择输出出现次数最多的10个单词

        System.out.println("读取的文件中出现频率最多的十个单词是:");
        int i = 0;
        for (Map.Entry<String, Integer> node : words) {
            if (i < 10) {
                System.out.println(node.getKey() + " : " + node.getValue());
            } else {
                break;
            }
            i++;
        }

    在编写过程中,起初对字母的读取是逢空格就存入StringBuffer对象里面,后来在自己在test文件里面随意写入的字母集合,如果有换行回车出现错误,局限比较大,而且对标点等无法进行读取,后面通过查询资料了解到使用HashMap,这下就解决了单词读取问题,只要不是字母的符号就自动转到StringBuffer对象里面,然后通过清空,又可以读取下一个单词。然后通过调用java里面自带排序方法,对集合中的数进行排序,最后通过一个if语句,将分析分本后统计的数据输出出来。原本预计一天就能将程序写出来,但是在晚上复查的时候,将简单的单词文本换成网上寻找的一篇文章,出现了很多的错误,浪费了许多的时间。方法思路的错误对程序造成的影响相当大。同时,对程序最后的测试也相当重要,能避免编写程序时出现的许多错误。

完整代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Test {
    private static String path = "English.txt";

    public static void main(String[] args) throws IOException {
        
        File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);

        int thechar;
        StringBuffer sb = new StringBuffer();
        HashMap<String, Integer> wordList = new HashMap<String, Integer>();
        
        while ((thechar = isr.read()) != -1) {
            char letter = (char) thechar;
            if ((letter >= 'a' && letter <= 'z')
                    || (letter >= 'A' && letter <= 'Z')) {
                sb.append(letter);
            } else if (sb.length() != 0) {
                String theword = new String(sb);
                if (wordList.containsKey(theword)) {
                    wordList.put(theword, wordList.get(theword) + 1);
                } else {
                    wordList.put(theword, 1);
                }
                sb.delete(0, sb.length());
            }
        }
        isr.close();
        
        List<Map.Entry<String, Integer>> words = new ArrayList<Map.Entry<String, Integer>>(
                wordList.entrySet());
        
        Collections.sort(words, new Comparator<Map.Entry<String, Integer>>() {

            @Override
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2) {
                return -(o1.getValue() - o2.getValue());
            }
        });
        System.out.println("读取的文件中出现频率最多的十个单词是:");
        int i = 0;
        for (Map.Entry<String, Integer> node : words) {
            if (i < 10) {
                System.out.println(node.getKey() + " : " + node.getValue());
            } else {
                break;
            }
            i++;
        }
    }

}

 

 

 

 

原文地址:https://www.cnblogs.com/leejrove/p/3576857.html