• 对于对英文文本文档进行分析,统计文本里面单词出现最多的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++;
            }
        }
    
    }

     

     

     

     

  • 相关阅读:
    ASP.NET Core路由中间件[4]: EndpointRoutingMiddleware和EndpointMiddleware
    ASP.NET Core路由中间件[3]: 终结点(Endpoint)
    ASP.NET Core路由中间件[2]: 路由模式
    ASP.NET Core路由中间件[1]: 终结点与URL的映射
    [LeetCode] 994. Rotting Oranges 腐烂的橘子
    [LeetCode] 993. Cousins in Binary Tree 二叉树的表兄弟节点
    [LeetCode] 992. Subarrays with K Different Integers 有K个不同整数的子数组
    [LeetCode] 991. Broken Calculator 损坏的计算器
    [LeetCode] 1143. Longest Common Subsequence 最长公共子序列
    [LeetCode] 990. Satisfiability of Equality Equations 等式方程的可满足性
  • 原文地址:https://www.cnblogs.com/leejrove/p/3576857.html
Copyright © 2020-2023  润新知