java - 显示带有 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;
}
解决方案
您的所有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
如果你以前没有看过那个文件的那个词,那就做一个新的),你应该很好!
推荐阅读
- angular - 使用路由 url 获取路由数据
- ms-access - 德尔福 5 和 ADO
- linux - 将 windows 互斥体移植到 linux
- ms-access - 通过将文件位置拖到 Access 表单中来提取文件位置?
- java - 如何从 JColorChooser 在 JLabel 中设置字体颜色
- spring-boot - Google OAuth 2.0 服务器端访问 Google Drive
- javascript - jQuery & Bootstrap 显示密码不适用于动态表单
- tableau-api - 表格中过滤值的总和
- android - 相对布局和视图消失
- vba - MS Access VBA 组合框打开一个对话框,而不是从表单中获取组合框值