zoukankan      html  css  js  c++  java
  • 读取一段文档,输出每个单词出现的频率,并且把出现频率最高的十个单词输出。

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

    首先看到这个题目。首先我对这个题目进行了分析,此过程大概持续了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++;
            }
        }
    
    }
    复制代码

    完成一次实验需要对实验进行分析,设计,编码,测试等多个步骤,每一步都不可缺少,这样才能保证实验的完整性。

  • 相关阅读:
    死循环(endless loop)
    while循环和do-while循环语句
    99乘法表(for循环嵌套)
    代码块和作用域
    Break语句和Continue语句
    习题两则的简化(利用for循环)
    for循环语句
    条件判断语句(if-else)
    习题两则(自增操作符和数据类型相关知识点)
    字符集、编码和字符串
  • 原文地址:https://www.cnblogs.com/hubaoyue/p/3760453.html
Copyright © 2011-2022 走看看