我尝试创建的程序是一个程序,它从用户定义的文件中获取单词,将这些单词保存为变量,然后在不同的用户定义文件中搜索这些单词,并输出位置。
程序可以处理并包括程序获取单词并将其保存为变量的点。该程序的问题是搜索方法返回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());
}
}
}
非常感谢任何帮助。
此致
答案 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
TokenReader
和searching
WordListSearcher
...