我有一个包含文档索引和发布日期的文件:

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

09-25 22:02