Java 如何找到文件夹中每个单词的位置?

Java 如何找到文件夹中每个单词的位置?,java,data-structures,Java,Data Structures,我正在尝试实现一个程序,将所有单词及其位置保存在给定文件夹的文件中。例如,有一个方法wordLoc(文件夹),它将父文件夹作为参数。我使用递归方法遍历父文件夹 然后我试图保存树映射中每个单词的位置,其中关键字是单词,值是单词位置对象的集合: WordLocation是一个具有字段路径、行、列的类: public class WordLocation { private String path; private int row; private int column;

我正在尝试实现一个程序,将所有单词及其位置保存在给定文件夹的文件中。例如,有一个方法
wordLoc(文件夹)
,它将父文件夹作为参数。我使用递归方法遍历父文件夹

然后我试图保存
树映射中每个单词的位置,其中关键字是单词,值是单词位置对象的集合:

WordLocation是一个具有字段路径、行、列的类:

public class WordLocation {
    private String path;
    private int row;
    private int column;
    
    public WordLocation(String path, int row, int column) {
        this.path = path;
        this.row = row;
        this.column = column;
    }
}
我的方法如下所示:

private void wordLoc(File file) throws IOException {
        if(file.isFile()) {
            BufferedReader br = new BufferedReader(new FileReader(file));
            int ch;
            int row = 1, column = 0;
            String word = "";
            do {
                ch = br.read();
                column++;
                if(ch == '\n'){
                    row++;
                    column = 0;
                } else if(isValid((char)ch)) {
                    word += (char)ch;
                } else {
                    if (word.length() > 0) {
                        WordLocation location = new WordLocation(file.getPath(), row, column-word.length());
                        // MAPPING OF WORD AND LOCATION GOES HERE                  
                        word = "";
                    }
                }
            } while (ch != -1);

            br.close();
        }
    }
这里的Helper方法
isValid(char ch)
只检查我的字符是否有效(字母数字值):


另外,我对剩下的部分有一个想法:遍历地图,看看搜索到的单词是否等于地图中的单词,如果是,我会遍历给定单词的所有位置,然后简单地打印出来。

看起来您想将一个单词(如“Tokyo”)映射到WordLocation对象的列表中。那么,让我们这样做:

private final Map<String, List<WordLocation>> locations = new HashMap<>();

这将从Tokyo获取关联的值,如果没有,将返回一个空列表(这避免了以后必须写入空检查)。然后你想做什么就做什么。它可能是空的。

看起来像是要将一个单词(如“Tokyo”)映射到WordLocation对象的列表。那么,让我们这样做:

private final Map<String, List<WordLocation>> locations = new HashMap<>();

这将从Tokyo获取关联的值,如果没有,将返回一个空列表(这避免了以后必须写入空检查)。然后你想做什么就做什么。它可能是空的。

它不会仍然给出单词的错误位置吗?现在它显示了文件中所有可能的位置,并将它们映射到每个单词。当我查找Tokyo时,它确实显示了所有可能的位置。您的“查找单词”代码有点可疑,但您的问题不是关于这一点,而是关于如何进行映射。您的“查找单词”代码有缺陷这一事实可能最好留给另一个问题来解决。不知道我问了“如何在文件夹中查找每个单词的位置?”xD。关于如何映射,我指的是映射单词和正确的位置。不过,非常感谢!它不会仍然给出一个词的错误位置吗?现在它显示了文件中所有可能的位置,并将它们映射到每个单词。当我查找Tokyo时,它确实显示了所有可能的位置。您的“查找单词”代码有点可疑,但您的问题不是关于这一点,而是关于如何进行映射。您的“查找单词”代码有缺陷这一事实可能最好留给另一个问题来解决。不知道我问了“如何在文件夹中查找每个单词的位置?”xD。关于如何映射,我指的是映射单词和正确的位置。不过,非常感谢!
private final Map<String, List<WordLocation>> locations = new HashMap<>();
map.putIfAbsent(word, w -> new ArrayList<WordLocation>()).add(location);
List<WordLocation> locations = map.getOrDefault("Tokyo", List.of());
for (WordLocation loc : locations) {
    System.out.println("  " + loc);
}