我有一个包含文档索引和发布日期的文件:
0,2012-05-26T00:00:00Z
1,2012-05-26T00:00:00Z
5,2010-06-26T00:00:00Z
10,2014-05-26T00:00:00Z
第二个文本文件,其中包含术语频率和属于他的文档的索引:
是15、1
杀死10,1
突尼斯5、5
和平,1,0
我有匹配两个文件的这种方法,所以我可以用这种形式获得第三个文件:
是,15,2012-05-26T00:00:00Z
杀死,10,2012-05-26T00:00:00Z
突尼斯,5,2010-06-26T00:00:00Z
和平,1,2012-05-26T00:00:00Z
我测试了测试文件的方法,它可以正常工作,但是文件大小为1T,因此我的程序已经执行了4天,仍然可以正常工作。您能否帮助我优化它或给我另一种方法。
public void matchingDateTerme (String pathToDateFich, String pathTotermeFich) {
try {
BufferedReader inTerme = new BufferedReader(new FileReader(pathTotermeFich));
BufferedReader inDate = new BufferedReader(new FileReader(pathToDateFich));
String lineTerme,lineDate;
String idFich, idFichDate,dateterm,key;
Hashtable<String, String> table = new Hashtable<String, String>();
String[] tokens,dates;
Enumeration ID=null;
File tempFile = new File(pathTotermeFich.replace("fichierTermes", "fichierTermes_final"));
FileWriter fileWriter =new FileWriter(tempFile);
BufferedWriter writer = new BufferedWriter(fileWriter);
//read file date
while ((lineDate = inDate.readLine()) != null) {
dates = lineDate.split(", ");
idFichDate = dates[0].toLowerCase();
dateterm=dates[1];
table.put(idFichDate, dateterm);
}
while ((lineTerme = inTerme.readLine()) != null) {
tokens = lineTerme.split(", ");
idFich = tokens[2].toLowerCase();
String terme=tokens[0];
String freq=tokens[1];
//lire hachtable
ID = table.keys();
while(ID.hasMoreElements()) {
key = (String) ID.nextElement();
if(key.equalsIgnoreCase(idFich)){
String line=terme+", "+freq+", "+table.get(key);
System.out.println("Line: "+line);
writer.write(line);
writer.newLine();
}
}
}
writer.close();
inTerme.close();
inDate.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
最佳答案
您没有使用Hashtable
的含义:将键映射到值的对象
遍历键是无用且昂贵的,只需使用get
方法:
if (table.get(idFich) != null) {
String line = terme + ", " + freq + ", " + table.get(key);
System.out.println("Line: " + line);
writer.write(line);
writer.newLine();
}
正如VGR在评论中所说,使用未同步的
HashMap
将更快。更多信息here