有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

有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 ]

文件2包含:

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) {

} 

共 (1) 个答案

  1. # 1 楼答案

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

    以下是一些建议,如果您的代码速度不够快,我会尝试使用这些建议:

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

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