首页 > 解决方案 > 显示带有 TreeSet 的嵌套 HashMaps 以显示某个文件中单词的索引

问题描述

我想显示(以 JSON 格式)文件中包含的单词列表,第一个键是单词,第二个键是它来自的文件,值是在文件中找到单词时的索引。唯一的问题是似乎新的 TreeSet 有问题,因为我所有的单词都有相同的 HashMap<String, TreeSet>。它们都有相同的嵌套 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;
}

标签: javafileindexinghashmapword

解决方案


您的所有HashMap<String, TreeSet>实例都是相同的,因为您只在方法开始时创建了一个实例 ( mapString),然后重新使用它。

在你内心的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如果你以前没有看过那个文件的那个词,那就做一个新的),你应该很好!


推荐阅读