用JAVA中给定的首字母将该行添加到数组中
有1500多个文本文件,每个文件可能有10行以上。但是假设有两个文件有5行 假设文件1包含:用JAVA中给定的首字母将该行添加到数组中,java,arrays,text-files,Java,Arrays,Text Files,有1500多个文本文件,每个文件可能有10行以上。但是假设有两个文件有5行 假设文件1包含: 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 ] shs isAwxpw lK hoih q iek n clY nwil ] ikv sicAwrw hoe
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 ]
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 ]
文件2包含:
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 ]
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 ]
因为“gk”是搜索词,返回的行分别以“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) {
}
BufferedReader读取器=null;
弦线;
对于(inti=1;i一如既往:不要在过早优化上浪费时间。如果您当前的实现足够快:就使用它吧
以下是一些建议,如果您的代码速度不够快,我会尝试使用这些建议:
- 这不是为了速度,而是为了正确性(因此也是最重要的):不要默默地假设你的台词总是至少有两个单词
- 不要使用
split('\\s+')
而是indexOf('')
查找第一个空格字符。然后向前一步,直到找到第一个非空格字符。无需进一步处理该行。如果需要处理以空格和其他字符(如制表符)开头的行,则需要一些思考才能更正
- 将每一行作为字符串读取会导致大量内存分配和释放。如果有许多匹配的行,您迟早都需要分配它们,但如果您的匹配比较稀疏,您可能会通过重复使用
char[]
buffers,这相当不方便,因为您现在必须自己扫描换行符。(如果您执行得不好,这可能会破坏已获得的优势。)
- 一旦您将文件看作一个长字符数组,内存映射文件可能会更快,也不会更不方便
- 如果您有多个CPU:使用管道模式让一个线程读取数据,n个线程对其进行过滤(您的程序可能是I/O绑定的,因此n=1是合适的),一个线程写入输出。这还将限制您的程序在任何时候使用的内存量,以便它能够很好地扩展
除了最后一点,这很好,所有这些优化都不会使您的软件更易于维护。因此,如果您当前的解决方案不是太慢,请不要轻易将它们合并。这些文件是在一个目录中吗?是的,它们只是命名为File1、File2、File3、…、File1000等。您是否在寻找更高效的文件比使用s.charAt(0)='g'&&s.charAt(s.indexOf(''')+1)='k'
(伪代码!)?哪个java版本?对于快速执行来说,在文件系统上工作是次优的,但我想将所有内容都放在DB中不是一个选项?1500个文件,每个文件(假设100行80个字符)每个字符0.2字节。这意味着1500*100*80*2=24000000字节,或24 MBs,这是很小的。为什么不将所有行读取到内存中的列表中呢?您甚至可以使用两个Map
按第一个和第二个字的第一个字符对所有行进行索引。当然,如果您的程序在一次查询后结束,则不需要这样做。