qingyunzh
qingyunzh
2010-02-06 14:05

统计一篇文章中单词个数的问题,效率很烂

已采纳

程序可以运行,就是在打印输出的时候,会花费很多时间,请教大虾们怎么优化这段代码
[code="java"]
for (int i = 0; i < size2; i++) {

        System.out.print(keys2[i] + "\t\t");

        for (int j = 0; j < size; j++) {

            Map<String, Integer> temp = list.get(j);

            if (temp.containsKey(keys2[i])) {

                System.out.print(temp.get(keys2[i]));
                break;
            }
        }

        System.out.println();

    }

[/code]
本人感激不尽

这是完整程序:
[code="java"]
package countwords;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**

  • @author qingyun
  • @version 2010.02.03
  • */
    public class CountWords {

    //
    private static List> list;

    // 单词分界符
    private static final String regex = "\W";

    // 排除 数字 干扰
    private static final String regex_digital = "\d*";

    public static void main(String[] args) throws IOException {

    list = new ArrayList<Map<String, Integer>>();
    
    File file = new File("D://file.txt");
    
    if (!file.exists()) {
    
        System.out.println("file not exists!");
    
        return;
    
    } else {
    
        long currentTime = System.currentTimeMillis();
    
        count(file);
    
        System.out.println("count cost time :"
                + (System.currentTimeMillis() - currentTime));
    
    }
    
    long currentTime1 = System.currentTimeMillis();
    
    print(list);
    
    System.out.println("print cost time :"
            + (System.currentTimeMillis() - currentTime1));
    

    }

    /**

    • 统计函数
    • @param file
    • @throws IOException
      */
      public static void count(File file) throws IOException {

      BufferedReader reader = new BufferedReader(new FileReader(file));

      String line = null;
      while ((line = reader.readLine()) != null) {

      /**
       * 
       */
      String[] temp = line.split(regex);
      
      for (int i = 0; i < temp.length; i++) {
      
          Map<String, Integer> map = new HashMap<String, Integer>();
      
          String key = temp[i];
          /**
           * 当时空置时的处理 不能用 == 来做判断
           */
          if ("".equals(key) || key.matches(regex_digital)) {
      
              continue;
      
          } else {
      
              // 使被统计的单词不区分大小写
              key = key.toLowerCase();
          }
          int num = 1;
      
          /**
           * first add
           */
          if (list.isEmpty()) {
      
              map.put(key, num);
      
              list.add(map);
      
          } else {
      
              // 遍历 list
              for (int j = 0; j < list.size(); j++) {
      
                  Map<String, Integer> index = list.get(j);
      
                  // 如果存在,就将key对应 value 加一 ,然后删除此节点,再添加到list当中
                  if (index.containsKey(key)) {
      
                      num = index.get(key);
      
                      num++;
      
                      index.remove(key);
      
                  }
      
              }
      
              map.put(key, num);
      
              list.add(map);
      
          }
      
      }
      

      }

    }

    /**

    • 打印函数
    • 考虑直接遍历此list,产生输出,但是发现效率不佳
    • */
      private static void print(List> list) {

      int size = list.size();

      Set keys = new HashSet();

      for (int i = 0; i < size; i++) {

      Map<String, Integer> map = list.get(i);
      
      keys.addAll(map.keySet());
      

      }

      System.out.println("keys size : " + keys.size());

      Object[] keys2 = keys.toArray();
      int size2 = keys2.length;

      Arrays.sort(keys2);

      System.out.print("word" + "\t\t");
      System.out.println("total");

      long now = System.currentTimeMillis();
      /**

      • 就这个地方的遍历花费很多时间,请教这个地方的代码优化
        */
        for (int i = 0; i < size2; i++) {

        System.out.print(keys2[i] + "\t\t");

        for (int j = 0; j < size; j++) {

        Map<String, Integer> temp = list.get(j);
        
        if (temp.containsKey(keys2[i])) {
        
            System.out.print(temp.get(keys2[i]));
            break;
        }
        

        }

        System.out.println();

      }
      System.out.println("-----" + (System.currentTimeMillis() - now));

    }

}
[/code]

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • lang_shao lang_shao 11年前

    实在看不懂。为什么要用List>?直接用Map不是足够了??

    点赞 评论 复制链接分享
  • louhui_2005 louhui_2005 11年前

    推荐你看一下这篇实现:
    [url]http://blog.csdn.net/treeroot/archive/2004/12/29/232797.aspx[/url]
    我觉得效率是一方面,而且是相对的,如果程序能建立在一个分工明细的基础代码上,就是效率少少慢一些,也是可以忽略的。特别是对于后面会有更复杂的业务逻辑要增加时。把一些独立的功能块拆分出去,将元素形成对象,也是可以参考一下其实现。

    点赞 评论 复制链接分享

相关推荐