如何在Hashtable中根据指定值获取对应的键?附代码疑问
解决方案:根据Hashtable的值获取对应键
我来帮你搞定这个问题!Hashtable本身确实没有提供直接根据值查键的API,不过我们可以通过遍历条目或者提前构建反向映射来实现,还能顺便优化你现有代码的执行效率。
1. 核心逻辑:根据值查找键的方法
如果只是偶尔做一次查找,用这个简单的方法就行(注意:如果多个键对应同一个值,这个方法会返回第一个匹配的键):
private Integer getKeyByValue(Hashtable<Integer, String> hashtable, String targetValue) { for (Map.Entry<Integer, String> entry : hashtable.entrySet()) { if (targetValue.equals(entry.getValue())) { return entry.getKey(); } } return null; // 没找到匹配值时返回null }
要是存在多个键对应同一个值的场景,就改成返回键的列表:
private List<Integer> getKeysByValue(Hashtable<Integer, String> hashtable, String targetValue) { List<Integer> matchingKeys = new ArrayList<>(); for (Map.Entry<Integer, String> entry : hashtable.entrySet()) { if (targetValue.equals(entry.getValue())) { matchingKeys.add(entry.getKey()); } } return matchingKeys; }
2. 优化你的findKeywords函数
你的代码目前只是打印匹配的关键词,没有把对应的键存入KeywordsFound列表,而且每次遍历单词都要循环所有Hashtable,效率偏低。我帮你改成提前构建反向映射的版本,让查找速度更快:
public void findKeywords(POITextExtractor te, ArrayList<Hashtable<Integer,String>> listOfHashtables, ArrayList<Integer> keywordsFound) { // 提前构建反向映射:关键词 -> 对应的键列表,避免重复遍历Hashtable Map<String, List<Integer>> keywordToKeysMap = new HashMap<>(); for (Hashtable<Integer, String> hashtable : listOfHashtables) { for (Map.Entry<Integer, String> entry : hashtable.entrySet()) { String keyword = entry.getValue(); Integer key = entry.getKey(); // 自动处理关键词的首次添加和后续键的追加 keywordToKeysMap.computeIfAbsent(keyword, k -> new ArrayList<>()).add(key); } } String document = te.getText().toString(); String[] words = document.split("\\s+"); int wordsNo = words.length; // 直接用数组长度计数更高效 int wordsMatched = 0; System.out.println("listOfHashtables = " + listOfHashtables); for (String word : words) { // 直接从反向映射中获取对应键,O(1)查找效率 List<Integer> keys = keywordToKeysMap.get(word); if (keys != null && !keys.isEmpty()) { wordsMatched++; System.out.println("匹配到关键词:" + word + ",对应的键:" + keys); // 将找到的键存入结果列表 keywordsFound.addAll(keys); } } System.out.println("Number of words in document = " + wordsNo); System.out.println("Number of words matched: " + wordsMatched); }
改动说明
- 反向映射优化:提前遍历所有Hashtable构建映射表,后续每个单词查找时无需再遍历Hashtable,大幅提升大文档、多Hashtable场景下的执行速度。
- 填充结果列表:把匹配到的键添加到
keywordsFound参数中,满足你返回对应键的需求。 - 简化计数逻辑:直接用
words.length获取文档单词数,比循环计数更简洁高效。 - 清晰调试输出:打印匹配关键词和对应键,方便你验证结果。
额外提示
- 如果需要忽略大小写匹配(比如文档里是"Apple",Hashtable里是"apple"),可以在构建映射和查找时统一转成小写:
keyword.toLowerCase()和word.toLowerCase()。 - 要是需要精确匹配(排除单词附带的标点),可以先清洗单词:
word = word.replaceAll("[^a-zA-Z0-9]", "")。
内容的提问来源于stack exchange,提问作者dsafas fsafasfsa
相关产品推荐
相关产品推荐

