读取一段文档,输出每个单词出现的频率,并且把出现频率最高的十个单词输出。

首先是第一次接触博客园,感觉这是一个非常棒的交流平台,不管是菜鸟还是老手都可以在这学习到很多。

首先看到这个题目。首先我对这个题目进行了分析,此过程大概持续了1天时间,最后我确定用Java来完成。

然后就是设计阶段:本程序利用HashMap先存储读取的单词,并且记录出现频率。然后倒入到List中,通过自定义的Comparator来通过频率高低排序,显示前十个。

然后进入编码阶段:此过程持续1天。

最后需要对自己编写的程序进行测试以及修改,发现不好的地方改进。

下面是对此程序每个阶段的具体分析:

一:此段程序是文件读取

File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);

二:此段程序是先声明一个StringBuffer对象,通过读取的字符来组成单词,当遇到
不是字母的时候得判断单词放入到一个HashMap中

复制代码
int thechar;
        StringBuffer word = 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')) {
                word.append(letter);
            } else if (word.length() != 0) {
                String theword = new String(word);
                if (wordList.containsKey(theword)) {
                    wordList.put(theword, wordList.get(theword) + 1);
                } else {
                    wordList.put(theword, 1);
                }
                word.delete(0, word.length());
            }
        }
        isr.close();
复制代码

三:将HashMap中的数据放到list中,利用Collections类提供的sort方法,根据自定义的Comparator来按照单词出现的频率从高到低显示,
此处利用Map对象的原理,将Map对象中的键值对组(Map.Entry)调出来排序

复制代码
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());
                //按照字母顺序排序
//                return (o1.getKey()).toString().compareTo(o2.getKey());
            }
        });
复制代码

四:下面是完整程序

复制代码
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 ReadingTest {
    private static String path = "a.txt";

    public static void main(String[] args) throws IOException {

        File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);
        // BufferedReader br = new BufferedReader(isr);

        // String data = null;

        int thechar;
        StringBuffer word = 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')) {
                word.append(letter);
            } else if (word.length() != 0) {
                String theword = new String(word);
                if (wordList.containsKey(theword)) {
                    wordList.put(theword, wordList.get(theword) + 1);
                } else {
                    wordList.put(theword, 1);
                }
                word.delete(0, word.length());
            }
        }
        isr.close();
        // br.close();
        System.out.println("排序前:");
        for (String key : wordList.keySet()) {
            System.out.println(key + " : " + wordList.get(key));
        }

            

        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/hubaoyue/p/3760453.html