qingyunzh 2010-02-06 14:05
浏览 237
已采纳

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

程序可以运行,就是在打印输出的时候,会花费很多时间,请教大虾们怎么优化这段代码
[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 2010-02-06 16:35
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。