zoukankan      html  css  js  c++  java
  • 作业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()+" "); } 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相同时,返回字母顺序的排序结果。(虽然我在这里只粗略的说了这么一点,但在我学习使用它时可是费了大力气!不过把它掌握了,费的力气就值得!)

          实验结果:今天我把代码做了一点点修改,在读取文件前和写入文件后分别加上输出语句,来感受一下自己的程序到底执行时间怎么样,如图

     

    修改:大文件效率测试

    根据邹老师和鞠老师的提醒,下载一部长篇txt英语小说《简·爱》(1.8M大小)再次测试,这次我把排序封装到函数Sort(map);中,便于详细看到部分方法执行效率,体会一下效率差别。

    首先看一下那部分运行时间最长:

    结果也是我原来所想的那样,统计单词所用时间最长(isNumeric函数在统计单词中使用),其次是排序,文件流读取。

      将  i<infoids.size();   改为 int len=infoids.size();   i<len;  。下面是对比分析结果:可以看出,这条语句的修改还是明显提高了效率的。

     

       实验结果如图:

       

      通过这次作业我认识到编程语言在使用的时候的一个注意点:当我在某个块中定义一个变量时,该块外不好用,我也是在犯了几次错后认识到这个问题,这应该是变量的作用域的问题

      任务更新:

           小林老师提醒把文件名作为参数,这样更灵活,为此,再次做简单修改:使用Scanner类,在控制台输入所想要处理的文件。新增代码如下:

              //读取文档
              System.out.println("请输入所要查询的文件路径及文件名:");
              Scanner sc=new Scanner (System.in);
              String files=sc.nextLine();
              sc.close();
              File file = new File(files+".txt");

           问题是输入文件名还要带上文件路径,感觉不太方便。

           这次更新的要求是查询指定单词的词频,在原来代码上实现这个功能比较简单,只需使用equalsIgnoreCase方法比较id.getKey()与所输入的单词是否匹配,如果匹配,输出键值(次数)即可,否则通过循环改变id,如此再进行匹配工作。新增代码如下:

               System.out.println("请输入要查询的单词:");
               Scanner sc=new Scanner(System.in);
               String word=sc.nextLine(); 
               sc.close();
               int len =infoids.size();
               for (int i = 0; i <len; i++)
               {
                  Entry<String, Integer> id =infoids.get(i);
                  if(id.getKey().equalsIgnoreCase(word))
                      System.out.println("该词在本文件中出现的次数为:"+id.getValue()+"次");
                  else
                      continue;
               
               }

    测试结果如图:

    另外,在写完代码时,发现了几个警告(虽然警告存在仍然可以运行),分别是提醒我有些引入的包没有使用,文件流没有关闭等。于是又进行了简单修改,终于把所有problem清除!

          

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

          

  • 相关阅读:
    IISManager 的启动
    基于hadoop集群的hive 安装(mysql,derby)
    Struts中央控制器
    在Spring中配置Hibernate事务
    java 实现多线程下载
    hello,博客园
    easyui datagrid中添加右键菜单事件
    C#项目打包
    easyui datagrid中单击添加菜单事件
    SQL多条件查询拼接in中条件方法
  • 原文地址:https://www.cnblogs.com/mzfeng/p/5304358.html
Copyright © 2011-2022 走看看