同时搜索外部文件中的多个单词(Java)

时间:2012-12-12 15:15:08

标签: java netbeans

我尝试创建的程序是一个程序,它从用户定义的文件中获取单词,将这些单词保存为变量,然后在不同的用户定义文件中搜索这些单词,并输出位置。

程序可以处理并包括程序获取单词并将其保存为变量的点。该程序的问题是搜索方法返回null结果。我主要怀疑搜索方法中的代码与read方法中的代码不兼容,或者两种方法没有同时运行。

搜索方法位于搜索类中,读取方法位于读取类中。

这是我的代码(包含我的所有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();

}    
}

这是第二堂课:

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());  
    }
}
}

这是第三堂课:

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());
    } 
}
}

非常感谢任何帮助。

此致

1 个答案:

答案 0 :(得分:1)

您的代码很难阅读。你的reading课程不只是阅读;它也搜索。你应该把它称为反映其预期用途的东西。但是,它忘记告诉其searching对象在哪里搜索,并且不会将对该对象的引用传递给其他任何人。在这个片段中

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

    searching searchingObject = new searching();
    searchingObject.setWord(word);
}
你基本上没有做任何事情。对searchingObject的引用将永远丢失。

您的reading类应该在searching中保留要搜索的单词的ArrayList,而不是实例化搜索对象。

您的searching类应该作为构造函数参数,使用其中一个ArrayLists - 并将其转换为单个正则表达式,这比每个单词读取一次要搜索的文件效率高得多。您可以使用单个正则表达式“a | b | c”搜索“a”,“b”和“c”。也可以使用更长的单词。首先逃避它们以避免问题。

哦,请,请遵循命名准则。请致电reading TokenReadersearching WordListSearcher ...