提问者:小点点

在Hashmap中查找匹配的键/值对


假设这是我的hashmap:

HashMap<String,String> map = new HashMap<>();
map.put("animal", "Golden Retriever");
map.put("size", "big");
map.put("color","light golden");

借助这个Stack Overflow答案,我想出了如何通过将键值测试数据和映射本身传递给函数来获得一个特定的匹配元素键值对。

现在,我想扩展该功能,以便应用程序将多个键值对作为参数,并仍然确定是否有任何匹配的元素。

我想我可以处理这个任务的方法是首先更改函数的参数,以便它需要两个hashmap。在这里,最终会有一个循环,在原始hashmap上运行testdata,看看是否有任何匹配的元素。

处理这项任务的最佳方法是什么?


共2个答案

匿名用户

您可以传递两个HashMap并遍历一个并检查另一个中是否有匹配项。
方法采用haristack作为检查其中任何针的方法。相应地返回布尔值

public boolean ifContains(HashMap<String, String> haystack, HashMap<String, String> needles) {
    for (String key : haystack.keySet()) {
        if (needles.containsKey(key) && needles.get(key).equals(haystack.get(key))) {
            return true;
        }
    }
    return false;
}

匿名用户

您可以使用流检查数据地图的条目是否包含搜索地图的条目之一:

import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        Map<String, String> data = new HashMap<>();
        data.put("animal", "Golden Retriever");
        data.put("size", "big");
        data.put("color", "light golden");


        Map<String, String> search = new HashMap<>();
        search.put("size", "small");
        search.put("color", "light golden");

        boolean matches = search.entrySet()
                .stream()
                .anyMatch(it -> data.entrySet().contains(it));

        System.out.println(matches);
    }
}

这是通过Map. Entry.equals()根据键和值相等来定义的。

您的实用程序方法如下所示:

public static <T, U> boolean matches(Map<T, U> data, Map<T, U> search) {
    return search.entrySet()
            .stream()
            .anyMatch(it -> data.entrySet().contains(it));
}