【问题标题】:How to get key from map using list as a value如何使用列表作为值从地图中获取键
【发布时间】:2015-08-13 07:25:37
【问题描述】:

我正在使用 Java 集合制作类似标签的东西。我使用列表作为值制作了一张地图。

我可以通过列表中的单词进行关键字搜索吗?我怎么能这样做?

Map<String, List<String>> map = new HashMap<String, List<String>>();    
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();

list1.add("mammal");
list1.add("cute");

list2.add("mammal");
list2.add("big");

map.put("cat", list1);
map.put("dog", list2);

【问题讨论】:

  • 同一个值可以映射到多个键。你会如何处理这种情况?也许您正在寻找 BiMap(查看 Guava 集合 API)。
  • 我认为没有理由像您那样使用 Map。我最好建议使用地图 en.wikipedia.org/wiki/Inverted_index 设计“还原索引”。通过这种方式,您可以将动物存储在转储集合中,同时构建有效的结构以从标签映射到动物。

标签: java list dictionary


【解决方案1】:
for (Entry<String, List<String>> entry : map.entrySet()) {
    if (entry.getValue().contains(animalYouSearch)) {
        System.out.println(animalYouSearch + " is in " + entry.getKey());
    }
}

搜索“哺乳动物”时的输出:

哺乳动物在猫中

哺乳动物是狗

【讨论】:

  • 谢谢,我想这就是我想要的:)
【解决方案2】:

如果我理解正确,您想获取给定列表中的值之一的键作为相应值存储吗?当然,您始终可以使用Map 接口的values() 方法获取所有这些列表,然后对其进行迭代。但是,如果有第二个地图,您将标签用作键并存储带有此标签的所有条目的列表?对于大型数据集,这可能会表现得更好。

【讨论】:

  • 这是正确的答案。 Larry Wall 曾经说过,遍历哈希的键就像用加载的 Uzi 将某人打死。
【解决方案3】:

没有“神奇”的方法,您需要在值内部搜索,然后报告正确的键。

例如:

String str = "cute";
List<String> matchingKeys = map.entrySet().stream().filter( e -> e.getValue().contains(str))
  .map(e -> e.getKey()).collect(Collectors.toList());

但您可能希望以其他方式存储数据,“特征”列表是键,值是动物名称。

【讨论】:

  • 如果他想切换键和值并使用列表作为键,那么他应该使用某种不可变列表,例如Guava,因为可变键类型是@987654322 @.
【解决方案4】:

如果要检索标签集,请使用此方法:

public Set<String> findMatchingKeys(Map<String, List<String>> map, String word){
        Set<String> tags = new HashSet<String>();
        for(Map.Entry<String,List<String> > mapEntry : map.entrySet()){
            if(mapEntry.getValue().contains(word))
                tags.add(mapEntry.getKey());
        }
        return tags;
    }

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 2022-08-17
    • 2011-05-10
    • 2023-03-14
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多