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