如何在 HashMap 中查找映射到 List 的键包含给定字符串的值

发布于 2025-01-17 02:20:28 字数 669 浏览 0 评论 0 原文

我有一张地图,上面有宠物主人的名字钥匙以及列表 宠物价值

我想获取拥有仓鼠的人的名字。

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

list.add("dog");
map.put("Pesho", list);

list.clear();
list.add("dog");
list.add("cat");
map.put("Anne", list);

list.clear();
list.add("iguana");
list.add("hamster");
list.add("turtle");
map.put("Kate", list);

 // The stream only returns if someone in the map has a hamster
System.out.println(map.values().stream()
                      .anyMatch(pets -> pets.contains("hamster"))); 

I have a map with a pet owner's name for key and a List of pets for a value.

I want to get the names of the people who have a hamster.

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

list.add("dog");
map.put("Pesho", list);

list.clear();
list.add("dog");
list.add("cat");
map.put("Anne", list);

list.clear();
list.add("iguana");
list.add("hamster");
list.add("turtle");
map.put("Kate", list);

 // The stream only returns if someone in the map has a hamster
System.out.println(map.values().stream()
                      .anyMatch(pets -> pets.contains("hamster"))); 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

总攻大人 2025-01-24 02:20:28

迭代需要在条目集键集上完成,不可能访问< em>key 当只有一个时。

anyMatch() 操作返回一个 boolean 值。您需要使用 findFirst() 获取单个结果,或使用 collect() 获取名称的集合。在这两种情况下,来自 anyMatch() 的谓词都需要放入 filter() 操作中。

终端操作 findFirst() 返回 Optional,因为结果可能不存在。您可以通过不同的方式从可选值中提取值,例如,通过应用 get(),但在可选值为空的情况下,它将抛出 NoSuchElementException。在下面的示例中,方法 orElse() 用于提供默认值。

String name =
        map.entrySet().stream() // stream of map-entries
                    .filter(entry -> entry.getValue().contains("hamster"))
                    .map(Map.Entry::getKey)
                    .findFirst()
                    .orElse("no owner was found");

操作 collect() 需要一个参数 Collector一个负责填充可变容器的对象,例如包含流元素的集合 )。

List<String> names =
       map.keySet().stream() // stream of owner names
                   .filter(key -> map.get(key).contains("hamster"))
                   .collect(Collectors.toList());  // Or `toList()` in Java 16+.

注意:

  • 当代码中的两个条目共享相同列表时。不需要调用 list.clear(); ,而是需要创建一个新列表,以便每个键都对应于不同的宠物名称集合。
  • 如果将 ArrayList 替换为 HashSet(即 map 将被声明为 Map),搜索性能将会更高。字符串>>)。

Iteration needs to be done over the entry set or over the key set, it is impossible to access a key when have only a value.

Operation anyMatch() returns a boolean value. You need to use either findFirst() to get a single result, or collect() to obtain a collection of names. In both cases, the predicate from the anyMatch() needs to be placed into the filter() operation.

Terminal operation findFirst() returns Optional because a result might not be present. You can extract a value from the optional in different ways, for instance, by applying get(), but in the case of empty optional it'll throw NoSuchElementException. In the example below, method orElse() is used to provide a default value.

String name =
        map.entrySet().stream() // stream of map-entries
                    .filter(entry -> entry.getValue().contains("hamster"))
                    .map(Map.Entry::getKey)
                    .findFirst()
                    .orElse("no owner was found");

Operation collect() expects as a parameter Collector (an object that is responsible for populating a mutable container, like a collection with elements of the stream).

List<String> names =
       map.keySet().stream() // stream of owner names
                   .filter(key -> map.get(key).contains("hamster"))
                   .collect(Collectors.toList());  // Or `toList()` in Java 16+.

Note:

  • When the two entries in your code will share the same list. Instead of invoking list.clear(); need to create a new list so that every key will correspond to a distinct collection of pet-names.
  • Search will be more performant if you replace an ArrayList with a HashSet (i.e. map will be declared as Map<String,Set<String>>).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文