You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:41:58