程序可以运行,就是在打印输出的时候,会花费很多时间,请教大虾们怎么优化这段代码
[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;
/**
*/
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));
}
/**
@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);
}
}
}
}
/**
*/
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]
实在看不懂。为什么要用List>?直接用Map不是足够了??
推荐你看一下这篇实现:
[url]http://blog.csdn.net/treeroot/archive/2004/12/29/232797.aspx[/url]
我觉得效率是一方面,而且是相对的,如果程序能建立在一个分工明细的基础代码上,就是效率少少慢一些,也是可以忽略的。特别是对于后面会有更复杂的业务逻辑要增加时。把一些独立的功能块拆分出去,将元素形成对象,也是可以参考一下其实现。