2012-04-19 13 views
0

テキストファイルを使用して値を読み取り、このファイルをバッファードリーダーにロードしています。その後私はファイルを行単位で読み込み、いずれかの行にキーワードが含まれているかどうかを確認しています(すでに文字列のリストにあります)。ラインはここで。私はそれを検出し、それにミスを与えていない探していますキーワードを含むあなたのバッファを反復している、キーワードごとにコード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()'を2回呼び出すことが問題であるように見える場合は、ファイルの行の半分をスキップします。 –

+0

キーワードのいずれかが指定された行にあるかどうか確認しますか?次に、ループの順番を入れ替え(また、 'readLine()'で問題を修正する必要があります)、次の行に移動する前にすべてのキーワードの行をチェックします。 – twain249

答えて

2

であるにもかかわらず、しかし

、 readLine()を使用します。あなたの最初のキーワードの後で、あなたはあなたのバッファ読書を使い果たしてしまい、US.readLine()があなたにnullを与えているので、次のキーワードテストは実行されません。あなたはあなたのリーダーを再初期化していません。

なぜあなたのファイルを一度(readLine()構造体を使用して)繰り返してから、の各行にのキーワードを反復するのはなぜですか?

EDIT:指摘したようにハンターでは、ループごとにreadLine()を2回呼び出しています。ループテストに1回、各行でキーワードを確認するために1回。まず、ファイルを正しく読んでいることを確認してください(単に各行を読むときに各行を印刷するだけです)。

1

whileループの入り口にもう一度入り込み、もう一度US.readLine()に電話しています。これにより入力が次の行に移動します。また、文字列を.equals()と比較し、部分文字列を確認する.contains()

+0

文字列内に部分文字列がある場合、文字列がどこにあるかを見たい文字列を比較したくないので、 'contains()'を使うのは正しいです。 – twain249

+0

ありがとう、それを編集:-) – noMAD

2

あなたはUS.readLine()を2回呼び出しています。

ではなく、試してみてください。問題の

String tempString; 
String str; 

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

データセットが参考になります。それがなければ、カップルの思考 -

  1. は、ソートされたキーワードのケースを確認し、テキストファイルからケースに一致します。それらが一致しておらず、大文字と小文字を区別しないマッチングをサポートする必要がある場合は、両方の文字列を同じケースに変換します(toUpperCase()など)。

  2. 並べ替えられたキーワードの末尾に余分な文字(改行など)が付加されていないことを確認します。

1

私には2つの大きな問題があります。

  1. あなたはループを後方に持っています。

    あなたが書いたやり方では、それはkeyword1を見て、入力全体を調べてkeyword1をチェックします。さて入力がなくなり、keyword2に移動しますが、チェックする入力がないので、残りのキーワードを繰り返し繰り返して終了します。

    入力をループし、キーワードではなく各キーワードをチェックし、各入力行をチェックします。

    while(input){ 
    
        for each keyword { 
        ... 
    
  2. あなたは効果的に他のすべての行をスキップし、反復ごとに二回.readLine()を呼んでいます。

    最初の行をループの外側に格納し、ループ状態でnullをチェックしてから、ループの最後の前にreadLineを呼び出すようにしてください。

+0

魅力的なように働いた。ありがとうございます。 – CodeMonkey

関連する問題