软件工程作业-----第二次

一.需求分析

1.统计一篇英文文章或者段落里出现的单词数量(词汇量)

2.统计每个单词出现的次数

3.对单词出现的次数进行排序输出

4.按照单词出现的次数进行输出,列出前10个单词的词频

5.批量文本处理

6.控制台读入英文单篇作品

二.功能实现

 

功能1  小文件输入。 为表明程序能跑,结果真实而不是迫害老五,请他亲自键盘在控制台下输入命令。

功能2  支持命令行输入英文作品的文件名,请老五亲自录入。

功能3  支持命令行输入存储有英文作品文件的目录名,批量统计。

功能4  从控制台读入英文单篇作品,或输入一段话。

文本的输入,路径的变化,灵活的拼接字符串,是获取输入的核心。

     if(args[0].contains(".")) {
             
          //功能1
          String filename = args[0];
          String filepath =new File("/").getAbsolutePath()+ filename;
          File file = new File(filepath);
              io(file);
     }else if(args[0].equals("folder")) { 
             //功能3 
             File dir = new File("E:/folder");
             File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
             if (files != null) {
                 for (int i = 0; i < files.length; i++) {
                    String fileName = files[i].getName();
                        if (files[i].isDirectory()) { // 判断是文件还是文件夹
                            files[i].getAbsolutePath(); // 获取文件绝对路径
                         } else if (fileName.endsWith("txt")) { // 判断文件名是否以.txt结尾
                             String filepath = files[i].getAbsolutePath();
                             File file = new File(filepath);
                             System.out.println(fileName.substring(0,fileName.length()-4));
                             io(file);
                             System.out.println("-------------------");
                            
                         } else {
                             continue;
                         }
                     }
                 }
             }else if(!args[0].equals("folder") &&!args[0].contains(".")) {      
                 //功能2    
                 String filename = args[0];
                 String filepath =new File("/").getAbsolutePath()+ filename + ".txt";
                 File file = new File(filepath);         
                 io(file);  
             }
         }     

 

文本读取,大小写不区分,只统计单词,剔除除字母以外的字符。

BufferedReader br = new BufferedReader(new FileReader(file));//新建缓存区读取为所需统计文件的读取     
        StringBuffer mp= new StringBuffer();//更新字符缓存为mp  
        String s;  
        //把要统计的文件装入字符串m  
        while (( s=br.readLine())!= null) { 
            s=s.toLowerCase();//转化成小写
                mp.append(s);//设置字符缓存的搜索路径是字符串mp  
        }  
        Map<String,Integer>  map = new HashMap<String, Integer>();//运用哈希排序的方法进行排序  
        StringTokenizer st = new StringTokenizer(mp.toString(),", ?.!:\"\"''\n");//分割字符串  
           
        while (st.hasMoreTokens()) {  
            String letter = st.nextToken();  
                int count;  
                if (map.get(letter) == null) {  
                      count = 1;//表明了没有进行分割。  
                } else {  
                     count = map.get(letter).intValue() + 1;  
                }  
                map.put(letter,count);  
            }  

对单词进行排序以及输出,使用TreeSet进行排序。

     Set<WordEntity> set = new TreeSet<WordEntity>();  
        for (String key : map.keySet()) {  
            set.add(new WordEntity(key,map.get(key)));  
        }  
             
        System.out.println("total \t"+map.size()+ "\t words");
        System.out.println();  
       
        int count = 1;  
        for (Iterator<WordEntity> it = set.iterator(); it.hasNext(); ) {  
            WordEntity w = it.next();
            { 
                System.out.println(w.getKey() + "\t\t"  + w.getCount());  
                if (count == 10)// 当输出10个后跳出循环  
                    break;  
                count++;  
            }  
        }  

定义一个单词的实体类WordEntity,包含两个元素,键值和次数,还有一些构造方法。

class WordEntity implements Comparable<WordEntity> {  
    private String key;  
    private Integer count;  
    public WordEntity (String key, Integer count) {  
        this.key = key;  
        this.count = count;  
    }  
    public int compareTo(WordEntity o) {  
        int cmp = count.intValue() - o.count.intValue();  
        return (cmp == 0 ? key.compareTo(o.key) : -cmp);  
                
    }  
    public String toString() { 
        return key + " 出现的次数为:" + count;  
    }  
    public String getKey() {  
        return key;  
    }  
    public Integer getCount() {  
        return count;  
    }  
}  

 

三.PSP阶段表格

 

 

 

四.代码

git地址:https://git.coding.net/lick468/wf.git

posted @ 2017-09-18 20:37  lick  阅读(232)  评论(0编辑  收藏  举报