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

     

     

     

     

  • 相关阅读:
    Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
    Cogs 376. [IOI2002]任务安排(后效性DP)
    Bzoj 1911: [Apio2010]特别行动队(斜率优化)
    Poj 2018 Best Cow Fences(分数规划+DP&&斜率优化)
    Bzoj 1212: [HNOI2004]L语言(AC自动机+DP)
    ZOJ 3228 Searching the String(AC自动机)
    Bzoj 3172: [Tjoi2013]单词(fail树)
    Hdu 3065 病毒侵袭持续中(AC自动机)
    Hdu 2896 病毒侵袭(AC自动机)
    Bzoj 2599: [IOI2011]Race(点分治)
  • 原文地址:https://www.cnblogs.com/leejrove/p/3576857.html
Copyright © 2011-2022 走看看