显示带有 TreeSet 的嵌套 HashMap,以显示特定文件中单词的索引

Displayed nested HashMaps with a TreeSet to display index of the word in a certain file

我想显示(以 JSON 格式)文件中包含的单词列表,第一个键是单词,第二个键是它来自的文件,值是单词的索引在 file.Only 问题中发现,新的 TreeSet 似乎有问题,因为我所有的单词都有相同的 HashMap。它们都有相同的嵌套 HashMap,但我当然希望它们中的每一个都是独立的。会喜欢一点帮助。 这是我的代码:

public static HashMap<String, HashMap<String, TreeSet<Integer>>> listStems(Path inputFile) throws 
IOException {
    HashMap<String, HashMap<String, TreeSet<Integer>>> finalString = new HashMap<String, 
    HashMap<String, TreeSet<Integer>>>();
    HashMap<String, TreeSet<Integer>> mapString = new HashMap<String, TreeSet<Integer>>();
    int counter=0;
    Stemmer stemmer = new SnowballStemmer(DEFAULT);
    try (BufferedReader br =
            new BufferedReader(new InputStreamReader(
                    new FileInputStream(inputFile.toString()), "UTF-8"));) {    
                String line;
                while((line = br.readLine()) != null) {
                    String[] toStemArray = parse(line);
                    
                    for(int i = 0;i<toStemArray.length;i++) {
                        counter++;
                        if(!finalString.containsKey(toStemArray[i])) {
                            mapString.put(inputFile.toString(), new TreeSet<Integer>());
                            finalString.put(toStemArray[i], mapString);
                            finalString.get(toStemArray[i]).get(inputFile.toString()).add(counter);
                        }
                        else if(finalString.containsKey(toStemArray[i])) {
                            finalString.get(toStemArray[i]).get(inputFile.toString()).add(counter);
                        }
                    }
                }
    }       
    return finalString;
}

您的所有 HashMap<String, TreeSet> 个实例都是相同的,因为您只在方法的开头创建了一个实例 (mapString),然后 re-use 它。

在你的内部 if 语句中,你检查你是否以前见过这个词,如果你没有,你添加一个条目到你的单曲 HashMap<String, TreeSet> 映射文件名更改为新的空 TreeSet<Integer>。这几乎是正确的模式——您正在检测一个新词并创建一个新的 TreeSet,而不是创建一个新的 HashMap<String, TreeSet>.

如果您希望每个单词有一个 HashMap<String, TreeSet>,您需要在每次看到一个新单词时都创建一个新单词,而不是一次。将你的 new HashMap<String, TreeSet<Integer>>() 移动到 mapString.put 行之前,你将 几乎 让它工作:你将有一个 HashMap<String, TreeSet> 每个单词但是现在你只创建了一个 TreeSet.

以同样的方式解决这个问题(如果您以前没有看到该词的那个文件,则通过制作一个新的 TreeSet),您应该没问题!