Java:搜索多次出现的文本

时间:2015-06-05 02:06:15

标签: java search

问:如果给我一个过于庞大的随机英文单词,并被告知找到由空格切割的特定子字符串[例如,"现在如何","棕色牛& #34;等等,然后返回它出现的位置,我该怎么做?

答:我有部分解决方案,但我要求Stack Overflow社区帮助完成最后一点。

程序应如何运行:

  • 为程序提供文本文件
  • 搜索整个文件
  • 返回行号和字号;单词编号与行

  • 有关
  • 如果"现在如何"被发现是两个连续行的前两个单词,它将返回"现在如何"在位置1的k线上找到,并且在位置1的k + 1线上再次找到。

  • 如果该行是"现在如何计算monte brown cow cristo"那么它应该能够检测到"现在如何"和"棕色牛"作为两个单独的事件发生。

解决方案1:

int chn = 0;
int cbc = 0;

Scanner in = new Scanner(new File("filename.txt"));
String temp = in.nextLine();

Pattern phn = Pattern.compile("how now");
Pattern pbc = Pattern.compile("brown cow");
Matcher mhn = null;
Matcher mbc = null;

while (in.hasNext()) {

    mhn = phn.matcher(temp);
    while (mhn.find()) m++;

    mbc = pbc.matcher(temp);
    while (mbc.find()) j++;

    temp = in.nextLine();
} // Formatted output comes after

事情是,通过使用模式和匹配器跟踪出现次数(chn,cbc),并跟踪时间顺序,并且这是最快的算法,我不知所措我怎样才能跟踪它出现在哪一行。

解决方案2:

Scanner in = new Scanner(new File("filename.txt"));
ArrayList<String> wordsInLine = new ArrayList<>();
String temp = in.nextLine();
String temp2 = "";

ctL = 1;

while (in.hasNext()) { 
    if (temp.contains("how now")) {
        for (String word : temp.split(" ")) {
            wordsInLine.add(word);
        }
        for (int i = 0; i < wordsInLine.size(); i++) {
            if (wordsInLine.get(i).equals("how") || 
                wordsInLine.get(i + 1).equals("now")) {

                System.out.println("This returns line count and "
                    + "the occurrence by getting i");
            }
        }
    }

    ctL++;
    temp = in.nextLine();
}

但是这个第二个部分解决方案看起来非常低效且速度非常慢,每个行包含两个for循环,包含&#34;现在如何。&#34;
有更优雅的方式吗?

2 个答案:

答案 0 :(得分:2)

解决方案1肯定更有效率,我肯定会采用这种方法。

为了跟踪特定行中匹配模式的位置,您可以使用start()类的end()Matcher方法获取相应的索引

答案 1 :(得分:0)

使用解决方案1.使用start,end和group方法跟踪匹配的子序列:

mhn = phn.matcher(temp);

while (mhn.find()) {
    System.out.print(mhn.start() + ", ");
    System.out.print(mhn.end() + ", ");
    System.out.println(mhn.group());
    m++;
}