2012-04-19 79 views
0

我正在使用文本文件从中读取值并将其加载到缓冲读取器中。此后,我逐行读取文件,并检查是否有任何行包含我的关键字之一(我已将它们放入String列表中)。Java子字符串匹配失败

然而,即使行包含我期待它不会检测到它的关键字,并赋予它一个小姐,这里是代码

for(int i=0;i<sortedKeywordList.size();i++) 
     { 
     String tempString=sortedKeywordList.get(i); 
     while(US.readLine()!=null) 
     { 
      String str=US.readLine(); 
      //System.out.println(str); 
      if(str.contains(tempString)){ 
       System.out.println("Contains: "+tempString); 
      }    
      else{ 
       System.out.println("Miss"); 
      } 
     } 
    } 
+3

调用'readLine()'两次似乎是问题,您将跳过文件的一半以上的行。 – 2012-04-19 17:02:03

+0

你想检查是否有任何关键字在给定的行中?然后你应该切换循环的顺序(以及用'readLine()'修复这个问题),这样你就可以在移动到下一行之前检查每个关键字的行。 – twain249 2012-04-19 17:05:40

回答

2

对于每个关键字,你通过你的缓冲区迭代使用readLine()。因此,在您的第一个关键字之后,您将耗尽您的缓冲区读数,并且由于US.readLine()会让您为空,因此下一个关键字测试甚至不会执行。你不会重新初始化你的读者。

那么为什么不重复通过您的文件一次(使用您的readLine()结构),然后为每行遍历您的关键字?

编辑:正如Hunter所指出的(上面),你也每次循环调用readLine()两次。一旦进行循环测试,并且每次检查一次关键字。我首先要确保你正确地读取文件(只要在阅读时打印出每行)

1

您在while循环入口处再次呼叫US.readLine(),并再次在里面。这将输入移动到下一行。此外,比较字符串.equals()并检查使用的子串.contains()

+0

他不想比较字符串,他想看看字符串是否有子字符串,所以使用'contains()'是正确的。 – twain249 2012-04-19 17:01:57

+0

谢谢,编辑它:-) – noMAD 2012-04-19 17:03:26

2

您打电话给US.readLine()两次!

尝试,而不是:

String tempString; 
String str; 

for(...) 
{ 
    tempString = sortedKeywordList.get(i); 
    while((str = US.readLine()) != null) 
    { 
     ... 
    } 
} 
0

有问题的数据集将是有益的。没有它,一对夫妇的想法 -

  1. 验证排序的关键字大小写与文本文件大小写匹配。如果它们不匹配,并且您需要支持不区分大小写的匹配,请将这两个字符串转换为相同的大小写(例如,使用toUpperCase()),然后使用contains()调用。

  2. 验证没有额外的字符(如换行符/等)追加排序关键字的结尾。

1

我看到两个主要问题。

  1. 你有你的循环倒退。

    您编写它的方式看起来是关键字1,然后查看整个输入,检查关键字1。现在,没有更多的输入,它移动到关键字2,但没有任何输入可供检查,因此它可以快速遍历其他关键字并退出。

    您希望遍历输入,检查每个关键字,而不是通过关键字检查每行输入。

    while(input){ 
    
        for each keyword { 
        ... 
    
  2. 你打电话.readLine()两次,每次迭代,有效地跳过所有其他行。

    尝试在循环之外存储第一行,在循环条件中检查null,然后在循环结束之前调用readLine juuust。

+0

工作就像一个魅力。谢谢你,先生。 – CodeMonkey 2012-04-19 17:11:04