1

私が作成しようとしているプログラムは、ユーザー定義ファイルから単語を取得し、それらの単語を変数として保存し、別のユーザー定義ファイルでそれらの単語を検索して、その場所を出力するプログラムです。

プログラムは、プログラムが単語を取得して変数として保存するポイントまで動作します。このプログラムの問題は、検索メソッドが null の結果を返すことです。私の主な疑いは、検索メソッドのコードが読み取りメソッドのコードと互換性がないか、2 つのメソッドが同時に実行されていないことです。

search メソッドは search クラスにあり、read メソッドは reading クラスにあります。

これが私のコードです(私のクラスの3つすべてを含みます)、すべてのインポートを許してください。

これは最初のクラスです:

import java.io.FileNotFoundException;
import java.util.Scanner;

public class Combination{

    public static void main(String[] args) throws FileNotFoundException{

    Scanner userInput = new Scanner(System.in);
    Reading ReadingObject = new Reading();        
    System.out.println("Please enter the file that you wish to open");
    String temp = userInput.nextLine();
    ReadingObject.setFileName(temp);
    ReadingObject.read();
    Scanner searchForWord = new Scanner(System.in);
    Searching SearchingObject = new Searching();
    System.out.println("Please enter the file that you would like to search for these words in");
    String temp1 = searchForWord.nextLine();
    SearchingObject.setFileName(temp1);
    SearchingObject.search();

}    
}

これは 2 番目のクラスです。

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;

class Reading {
private String file;
public void setFileName(String fileName){
    file = fileName;
}
public String getFileName(){
    return file;
}
public void read(){
    try{
        //Choosing the file to open
        FileInputStream fstream = new FileInputStream(getFileName());

        //Get the object of datainputstream
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine = null;

        //Read the file line by line
        while((strLine = br.readLine()) != null){
            //      \\s+ means any number of whitespaces between tokens
            String [] tokens = strLine.split("\\s+");
            String [] words = tokens;
            for(String word : words){
                System.out.print(word);
                System.out.print(" ");

                Searching SearchingObject = new Searching();
                SearchingObject.setWord(word);
            }
            System.out.print("\n");   
        }
        in.close();  
    }
    catch(Exception e){
        System.err.println("Error: " + e.getMessage());  
    }
}
}

これは 3 番目のクラスです。

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Searching {
private String file1;
public void setFileName(String fileName){
    file1 = fileName;
}
public String getFileName(){
    return file1;
}
private String word1;
public void setWord(String wordName){
    word1 = wordName;    
}
public String getWord(){
    return word1;
}

public void search() throws FileNotFoundException{

    try{
        //Choosing the file to open
        FileInputStream fstream = new FileInputStream(getFileName());

        //Get the object of datainputstream
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine = null;

        while((strLine = br.readLine()) != null){

            Pattern p = Pattern.compile(getWord());
            Matcher m = p.matcher(strLine);

        int start = 0;
        while (m.find(start)) {
            System.out.printf("Word found: %s at index %d to %d.%n", m.group(), m.start(), m.end());
            start = m.end();
                }
          }        
    }
    catch(Exception e){
        System.err.println("Error: " + e.getMessage());
    } 
}
}

どんな助けでも大歓迎です。

よろしく

4

1 に答える 1

1

あなたのコードは読みにくいです。あなたのreadingクラスは読むだけではありません。それも検索します。使用目的を反映したものと呼ぶ必要があります。ただし、検索する場所をオブジェクトに伝えるのを忘れておりsearching、このオブジェクトへの参照を他の人に渡しません。このスニペットでは

for (String word : words) {
    System.out.print(word);
    System.out.print(" ");

    searching searchingObject = new searching();
    searchingObject.setWord(word);
}

あなたは本質的に何もしていません。への参照searchingObjectは永久に失われます。

クラスは、検索オブジェクトをインスタンス化readingするのではなく、 で検索する単語の ArrayList を保持する必要がありsearchingます。

クラスはコンストラクタ パラメータとしてこれらのArrayListsearchingの 1 つを取り、それを 1 つの正規表現に変換する必要があります。これは、検索する単語ごとに 1 回ファイルを読み取るよりもはるかに効率的です。単一の正規表現 "a|b|c" を使用して、"a"、"b"、および "c" を検索できます。より長い単語でも機能します。問題を回避するために、最初にそれらをエスケープします。

ああ、どうぞ、命名ガイドラインに従ってください。readingあなたの aを呼び出し、TokenReaderあなたsearchingの a WordListSearcher...

于 2012-12-12T15:36:51.920 に答える