Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JAVA中给定的首字母将该行添加到数组中_Java_Arrays_Text Files - Fatal编程技术网

用JAVA中给定的首字母将该行添加到数组中

用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

有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 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
按第一个和第二个字的第一个字符对所有行进行索引。当然,如果您的程序在一次查询后结束,则不需要这样做。