如何验证哈希映射中的值是否存在

2022-09-03 09:30:36

我有以下情况,其中 是 a,而 the 由 a 表示:HashMapkeyStringvalueArrayList

 HashMap<String, ArrayList<String>> productsMap = AsyncUpload.getFoodMap();

我还在我的应用程序中实现了另一个。ArrayList<String> foods

我的问题是,找出我的第二个是否包含特定的最佳方法是什么?HashMapStringArrayList

我尝试过没有成功:

Iterator<String> keySetIterator = productsMap.keySet().iterator();
Iterator<ArrayList<String>> valueSetIterator = productsMap.values().iterator();

    while(keySetIterator.hasNext() && valueSetIterator.hasNext()){
        String key = keySetIterator.next();
        if(mArrayList.contains(key)){
            System.out.println("Yes! its a " + key);
        }
    }

答案 1

为什么不呢:

// fast-enumerating map's values
for (ArrayList<String> value: productsMap.values()) {
    // using ArrayList#contains
    System.out.println(value.contains("myString"));
}

如果您必须迭代整个 ,而不是只查找一个特定值:ArrayList<String>

// fast-enumerating food's values ("food" is an ArrayList<String>)
for (String item: foods) {
    // fast-enumerating map's values
    for (ArrayList<String> value: productsMap.values()) {
        // using ArrayList#contains
        System.out.println(value.contains(item));
    }
}

编辑

过去,我用一些Java 8习语更新了这个。

Java 8 流 API 允许以更具声明性(也可以说是优雅)的方式来处理这些类型的迭代。

例如,这里有一个(稍微太冗长)实现相同目标的方法:

// iterate foods 
foods
    .stream()
    // matches any occurrence of...
    .anyMatch(
        // ... any list matching any occurrence of...
        (s) -> productsMap.values().stream().anyMatch(
            // ... the list containing the iterated item from foods
            (l) -> l.contains(s)
        )
    )

...这是一种实现相同目标的更简单的方法,最初迭代值而不是以下内容:productsMapfoods

// iterate productsMap values
productsMap
    .values()
    .stream()
    // flattening to all list elements
    .flatMap(List::stream)
    // matching any occurrence of...
    .anyMatch(
        // ... an element contained in foods
        (s) -> foods.contains(s)
    )

答案 2

您需要使用该方法。为此,您只需获取要从中获取密钥的哈希映射,然后使用该方法,如果这样做,它将返回一个值。这将搜索整个哈希映射,而无需迭代每个项目。如果您确实有密钥,则只需检索该值即可。containsKey()containsKeyboolean

它可能看起来像这样:

if(productsMap.values().containsKey("myKey"))
{
    // do something if hashMap has key
}

这是安卓系统的链接

来自安卓文档:

公共布尔值包含 API 级别 1 中添加的密钥(对象密钥)

返回此映射是否包含指定的键。参数键键键要搜索的键。返回

true if this map contains the specified key, false otherwise.