将行添加到JAVA中具有给定首字母的数组中

时间:2014-09-14 13:57:06

标签: java arrays text-files

有超过1500个文本文件,每个文件可能有超过10行。但是,假设有两行文件有5行。

假设File1包含:

gwvY ko qwxu hovY iksY qwxu ]
gwvY ko dwiq jwxY nIswxu ]
hukmI hovin jIA hukim imlY vifAweI ]
gwvY ko gux vifAweIAw cwr ]
gwvY ko jIA lY Piir dyh ]

和File2包含:

shs isAwxpw lK hoih q iek n clY nwil ]
ikv sicAwrw hoeIAY ikv kUVY qutY pwil ]
gwvY ko ividAw ivKmu vIcwru ]
gwvY ko swij kry qnu Kyh ]   
hukmI auqmu nIcu hukim iliK duK suK pweIAih ]

如果有人搜索“gk”,那么搜索应该从File1开始到File2,并且应该将包含'g'的任何行作为第一个单词的第一个首字母(在行中)和'k'作为来自两个文本文件的第二个单词(在行中)的第一个首字母。

例如,在这种情况下,数组应返回:

gwvY ko qwxu hovY iksY qwxu ]
gwvY ko dwiq jwxY nIswxu ]
gwvY ko gux vifAweIAw cwr ]
gwvY ko jIA lY Piir dyh ]
gwvY ko ividAw ivKmu vIcwru ]
gwvY ko swij kry qnu Kyh ]

因为“g k”是搜索词,返回的行分别以'g'和'k'的第一个和第二个字母开头。 我不确定解决这个问题的最佳方法和最快方法是什么。这里的任何人都可以帮我这个吗?我真的很感激。谢谢。

目前,我使用以下方式。

BufferedReader reader = null;
String mLine;
for (int i = 1; i <=1500; i++){   //1500 Files, for-loop runs 1500 times.

try {
   reader = new BufferedReader(new InputStreamReader(open("File"+i)));
   mLine = reader.readLine();    // Files are read one-by-one and then the lines are ready one-by-one

    while (mLine != null) {
    String[] array_line = mLine.split("\\s+");  //words in the line are separated by the space are collected in an array.

    // and search_word_arr is when the user enters "g k" the search_word_arr[0] = 'g' and search_word_arr[1] = 'k' and then the initial of the words in the line are checked.
    if((array_line[0].startsWith(""+search_word_arr[0])) && (array_line[1].startsWith(""+search_word_arr[1]))){
       arr.add(mLine);
    }
    mLine = reader.readLine(); 
    }
  } catch (IOException e) {

} 

1 个答案:

答案 0 :(得分:1)

一如既往:不要在过早优化上浪费时间。如果你当前的实现足够快:只需使用它!

如果结果证明它不够快,我会尝试一些建议:

  • 这不是速度,而是正确性(因此也是最重要的):不要默默地假设你的行总是至少有两个单词。
  • 请勿使用split('\\s+')indexOf(' ')来查找第一个空格字符。然后前进,直到找到第一个非空格字符。无需进一步处理生产线。如果你需要处理以空格和其他字符(如制表符)开头的行,这需要一些思考才能正确。
  • 将每一行作为字符串读取会导致大量内存分配和释放。如果你有很多匹配的行,你需要迟早分配它们,但是如果你的匹配很稀疏,你可能会通过使用重新使用的char[]缓冲区获得一些东西,这是非常不方便的,因为你&#39;我现在必须自己扫描新行。 (如果你实施得不好,这可能会破坏所获得的优势。)
  • 一旦您将文件视为一长串字符,内存映射文件可能会更快,而且不会更加不方便。
  • 如果您有多个CPU:使用 Pipeline 模式在数据中读取一个线程,n个线程对其进行过滤(您的程序可能会受I / O限制,因此n = 1将适当)并且一个线程写入输出。这也将限制程序在任何时候使用的内存量,以便它可以很好地扩展。

除了最后一点,这很好,所有这些优化都不会使您的软件更易于维护。因此,如果您当前的解决方案实际上并不太慢,请不要轻易合并它们。