作业4-两人编程<词频统计>

Posted 苗中峰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作业4-两人编程<词频统计>相关的知识,希望对你有一定的参考价值。

       协作:苗中峰,刘鑫成

      我主要攻克排序,成哥写了文件流的使用。整合工作由我完成,成哥帮我查阅资料,避免和解决语法错误。

      技术分享

 

 

      这次任务较作业三的变化是:

      *文件流读取,写入。

      *单词排序(先按照频率排序,次数相同安字母顺序排序)

 

       java文件流的读取上次作业已经get,所以这个按道理来说不算问题。

       而文件流写入虽然上次没有用,但是它与读取是一个承启呼应的关系,不难掌握,但是还是出现了一个小插曲,稍后再提。

1                File file = new File("e:\\文档\\Gone_with_the_wind.txt");
2                FileReader reader = new FileReader(file);
3                int fileLen = (int)file.length();
4                char[] chars = new char[fileLen];
5                reader.read(chars);
6                String es= String.valueOf(chars);

        读取txt内容转换为String型,用表示句子的变量es接受,接下来运用作业3中的方法进行分词,统计操作。

 

                FileWriter writer = new FileWriter("E:\\Result.txt.txt");
                for (int i = 0; i <infoids.size(); i++) 
                    {   
                          Entry<String, Integer> id =infoids.get(i);

writer.write(id.getKey()+‘ ‘+id.getValue()+"\r\n"); } writer.flush(); writer.close();

        将每组单词和对应的频率写入文件。现在来说说在文件写入时遇到的问题:第一次是直接把文件写入写进了循环体里面,

   导致每一次写入一组数据时会覆盖掉上一组数据,解决很简单:

   FileWriter writer = new FileWriter("E:\\Result.txt.txt");
这条语句执行在循环体前
                  writer.flush();
                  writer.close();   
这两条语句执行在循环体后。


   下面是这次作业的一个重要步骤:sort
搜索一下排序方法,找到一个Collections类,可以对list对象实施排序操作:
1 public static void sort(List list)
2 public static void sort(List list,Comparator c)
第一行的方法是将元素按自然顺序排序,第二行的方法是按比较c排序。显然我们要先按频率排序要选择第二种方法。

 1      Collections.sort(infoids, new Comparator<Map.Entry<String, Integer>>() 
 2       {     //先按频率降序排序,频率相同时按字母顺序排序
 3             public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) 
 4                {     
 5                     if(o1.getValue()<o2.getValue())
 6                                 
 7                          return 1;
 8                     else if(o1.getValue()>o2.getValue())
 9                          return -1;
10                     else
11                          return(o1.getKey().compareTo(o2.getKey()));
12                 }     
13         });

      用compare方法比较两个Object类型的数据,通过调整返回值确定是按Value降序还是升序排序。最后当Value相同时,返回

  字母顺序的排序结果。(虽然我在这里只粗略的说了这么一点,但在我学习使用它时可是费了大力气!不过把它掌握了,费的力气就值得!)

 

下面是对比分析:

技术分享

 

   将 i<infoids.size();

   改为 int len=infoids.size();i<len;

  对比分析结果如上图。

      补充:通过这次作业我认识到编程语言在使用的时候的一个注意点:当我在某个块中定义一个变量时,该块外不好用,我也是在

 犯了几次错后认识到这个问题,这应该是变量的作用域的问题

     (完整源程序:https://github.com/miaozhongfeng/my-repository/blob/master/zuoye4.java)

      

 

以上是关于作业4-两人编程<词频统计>的主要内容,如果未能解决你的问题,请参考以下文章

作业之词频统计

第二周结对编程作业:词频统计

个人作业——词频统计

第二周结对编程作业——词频统计

个人作业3词频统计

作业4:结对项目—— 词频统计