开发者社区 问答 正文

Java程序读取文件,标记行,然后将它们存储在哈希图中

我一直在尝试很多事情。目前我有我的阅读功能

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

我想在选择文件按钮上按一下,以读取文件,按行标记化/标记化文件,然后将其存储在哈希图中。但目前它没有这样做。

展开
收起
垚tutu 2019-12-04 16:46:47 657 分享 版权
阿里云 AI 助理回答

从你的描述来看,你希望实现的功能是读取文件内容,将每一行作为一个Line对象存储,并且根据单词来索引这些行。为了达到这个目的,你需要在哈希表(HashMap)中以单词为键,对应的行号和行内容的列表为值。这里有一些修改建议:

  1. 初始化:确保你的myMap是一个HashMap<String, List<Line>>,这样可以使用单词作为键查找对应的行列表。

  2. 处理文本:在处理每行文本时,正确地分割单词并过滤非字母字符,然后将每个单词与当前行关联起来。

  3. 错误修正:修复代码中的逻辑错误,比如未完成的循环变量更新、未指定的哈希表操作参数等。

下面是基于你的代码进行修改后的示例:

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对象。这样,你就可以通过单词快速查找到所有包含该单词的行了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答