显示带有 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
),您应该没问题!
我想显示(以 JSON 格式)文件中包含的单词列表,第一个键是单词,第二个键是它来自的文件,值是单词的索引在 file.Only 问题中发现,新的 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;
}
您的所有 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
),您应该没问题!