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