1

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

该程序一直工作到并包括程序获取单词并将它们保存为变量的位置。该程序的问题是搜索方法返回空结果。我的主要怀疑是 search 方法中的代码与 read 方法中的代码不兼容,或者这两种方法没有同时运行。

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

}    
}

这是第二类:

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

任何帮助将不胜感激。

问候

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,而不是实例化搜索对象。

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

哦,请遵循命名准则。叫你reading的 a TokenReader,你searching的 a WordListSearcher...

于 2012-12-12T15:36:51.920 回答