我一直在尝试很多事情。目前我有我的阅读功能
private void readFile(File file) throws FileNotFoundException, IOException{
//StringBuilder fileContents = new StringBuilder();
BufferedReader bufferread = new BufferedReader(new FileReader(file));
String text;
int i=1;
while ((text = bufferread.readLine()) != null) {
//fileContents.append(text);
//fileContents.append("\n");
String[] tokens = text.split(" ");
Line line = new Line(i,text);
for(String token:tokens) {
tokens[i]=tokens[i].replaceAll("[^a-zA-Z]", "");
}
i++;
//for loop to go through tokens array
for(String token:tokens) {
if(myMap.containsKey())
{
List<Line> count = myMap.get();
count.add(line);
}
else{
myMap.put(, );
}
i++;
}
}
}
}
我的程序是一个gui,可让您使用1个按钮读取文件。然后可以在右下角搜索txt文件中的单词。然后输入一个单词并按search后,它会显示行号和该单词所在的所有行。我发布这个问题是因为我很难弄清楚如何将我的行存储在哈希图中。我有一个Line.java类,所以我只需要每个循环部分的帮助。我的第一个循环和第二个循环肯定可以合并。我的第二个大都是错的。
一些变量(我有一些用于此类内容的类,我只需要帮助将行存储在哈希图中)
String userSearchTerm = " ";
SimpleMap<String, List<Line>> myMap = new HashMapBackedSimpleMap<>();
我想在选择文件按钮上按一下,以读取文件,按行标记化/标记化文件,然后将其存储在哈希图中。但目前它没有这样做。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的描述来看,你希望实现的功能是读取文件内容,将每一行作为一个Line
对象存储,并且根据单词来索引这些行。为了达到这个目的,你需要在哈希表(HashMap)中以单词为键,对应的行号和行内容的列表为值。这里有一些修改建议:
初始化:确保你的myMap
是一个HashMap<String, List<Line>>
,这样可以使用单词作为键查找对应的行列表。
处理文本:在处理每行文本时,正确地分割单词并过滤非字母字符,然后将每个单词与当前行关联起来。
错误修正:修复代码中的逻辑错误,比如未完成的循环变量更新、未指定的哈希表操作参数等。
下面是基于你的代码进行修改后的示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FileReaderApp {
private Map<String, List<Line>> myMap = new HashMap<>();
public void readFile(File file) throws FileNotFoundException, IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String text;
int lineNumber = 1;
while ((text = bufferedReader.readLine()) != null) {
// 分割单词并去除非字母字符
String[] tokens = text.replaceAll("[^a-zA-Z]+", " ").split("\\s+");
for (String token : tokens) {
if (!token.isEmpty()) { // 确保单词不为空
// 如果单词不在哈希图中,则创建一个新的列表
myMap.putIfAbsent(token, new ArrayList<>());
// 将当前行添加到该单词对应的列表中
myMap.get(token).add(new Line(lineNumber, text));
}
}
lineNumber++;
}
bufferedReader.close();
}
// 假设你有一个Line类用于存储行号和内容
static class Line {
int number;
String content;
public Line(int number, String content) {
this.number = number;
this.content = content;
}
// 你可以根据需要添加getter和setter方法
}
// 示例用法
public static void main(String[] args) {
FileReaderApp app = new FileReaderApp();
try {
File file = new File("path_to_your_file.txt"); // 指定文件路径
app.readFile(file);
// 这里可以添加搜索功能,例如:
// String searchTerm = "your_search_term";
// List<Line> results = app.myMap.getOrDefault(searchTerm.toLowerCase(), Collections.emptyList());
// 打印或显示结果...
} catch (FileNotFoundException e) {
System.err.println("File not found.");
} catch (IOException e) {
System.err.println("Error reading file.");
}
}
}
这段代码首先读取文件的每一行,然后对每一行进行分词处理,同时过滤掉非字母字符。之后,它会将处理过的单词作为键,如果这个键不存在于哈希表中,则创建一个新的列表;如果已存在,则直接向该单词对应的列表中添加包含行号和内容的Line
对象。这样,你就可以通过单词快速查找到所有包含该单词的行了。