【问题标题】:How to verify if a value in HashMap exist如何验证HashMap中的值是否存在
【发布时间】:2013-08-25 16:43:16
【问题描述】:

我有以下HashMap,其中keyStringvalueArrayList 表示:

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

我的应用程序中还实现了另一个ArrayList&lt;String&gt; foods

我的问题是,从我的第二个 ArrayList 中找出我的 HashMap 是否包含特定 String 的最佳方法是什么?

我试过没有成功:

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);
        }
    }

【问题讨论】:

  • 您的key 值是否应该是特定字符串?
  • 是的。它应该是一个特定的字符串。
  • '没有成功'不是问题描述。
  • 没有循环的替代方法 productsMap.toString().contains(key) 。当然可能会有一些问题,比如键可以是一些不同值或映射键的一部分,这不适用于大地图。无论如何,这只是一种选择。

标签: java android arraylist iterator hashmap


【解决方案1】:

为什么不:

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

如果你必须遍历整个ArrayList&lt;String&gt;,而不是只寻找一个特定的值:

// 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)
        )
    )

...这里有一个更简单的方法来实现同样的效果,最初迭代 productsMap 值而不是 foods 的内容:

// 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)
    )

【讨论】:

  • 我对如果“myString”值不完全知道还有一些疑问,我只知道 myStri 。如何通过包含一些字符作为“myStri”来验证或找到完整值。你能帮我吗。@Mena.or任何人
【解决方案2】:

您需要使用containsKey() 方法。为此,您只需获取要从中取出密钥的 hashMap,然后使用 containsKey 方法,如果这样做,它将返回 boolean 值。这将搜索整个 hashMap 而无需遍历每个项目。如果您确实有密钥,那么您可以简单地检索该值。

它可能看起来像:

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

这是Android的链接

来自 Android 文档:

public boolean containsKey(对象密钥)在 API 级别 1 中添加

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

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

【讨论】:

  • 为什么它命名为 containsKey 而不是 containsValue?如果目的是知道它是否包含价值。
  • 为什么不使用productsMap.containsValue("myKey")
  • @aldok 您的问题中没有关于查看值的内容。
【解决方案3】:

试试这个:

public boolean anyKeyInMap(Map<String, ArrayList<String>> productsMap, List<String> keys) {
    Set<String> keySet = new HashSet<>(keys);

    for (ArrayList<String> strings : productsMap.values()) {
        for (String string : strings) {
            if (keySet.contains(string)) {
                return true;
            }
        }
    }

    return false;
}

【讨论】:

    【解决方案4】:
    hashMap.containsValue("your value");
    

    会检查HashMap是否包含值

    【解决方案5】:

    试试这个

    Iterator<String> keySetIterator = productsMap.keySet().iterator();
    Iterator<ArrayList<String>> valueSetIterator = productsMap.values().iterator();
    
        while(keySetIterator.hasNext()){
            String key = keySetIterator.next();
            if(valueSetIterator.next().contains(key)){    // corrected here
                System.out.println("Yes! its a " + key);
            }
    }
    

    【讨论】:

      【解决方案6】:

      如果你想要 Java 8 的方式,你可以这样做:

          private static boolean containsValue(final Map<String, ArrayList<String>> map, final String value){
          return map.values().stream().filter(list -> list.contains(value)).findFirst().orElse(null) != null;
      }
      

      或者是这样的:

          private static boolean containsValue(final Map<String, ArrayList<String>> map, final String value){
          return map.values().stream().filter(list -> list.contains(value)).findFirst().isPresent();
      }
      

      两者应该产生几乎相同的结果。

      【讨论】:

        【解决方案7】:

        这是一个测试这两种情况的示例方法。在地图的键中搜索项目,并在每个地图条目的列表中搜索项目:

        private static void testMapSearch(){
        
            final ArrayList<String> fruitsList = new ArrayList<String>();        
            fruitsList.addAll(Arrays.asList("Apple", "Banana", "Grapes"));
        
            final ArrayList<String> veggiesList = new ArrayList<String>();        
            veggiesList.addAll(Arrays.asList("Potato", "Squash", "Beans"));
        
            final Map<String, ArrayList<String>> productsMap = new HashMap<String, ArrayList<String>>();
        
            productsMap.put("fruits", fruitsList);
            productsMap.put("veggies", veggiesList);
        
            final ArrayList<String> foodList = new ArrayList<String>();        
            foodList.addAll(Arrays.asList("Apple", "Squash", "fruits"));
        
            // Check if items from foodList exist in the keyset of productsMap
        
            for(String item : foodList){
                if(productsMap.containsKey(item)){
                    System.out.println("productsMap contains a key named " + item);
                } else {
                    System.out.println("productsMap doesn't contain a key named " + item);
                }
            }
        
            // Check if items from foodList exits in productsMap's values
        
            for (Map.Entry<String, ArrayList<String>> entry : productsMap.entrySet()){
        
                System.out.println("\nSearching on list values for key " + entry.getKey() + "..");
        
                for(String item : foodList){
                    if(entry.getValue().contains(item)){
                        System.out.println("productMap's list under key " + entry.getKey() + " contains item " + item);
                    } else {
                        System.out.println("productMap's list under key " + entry.getKey() + " doesn't contain item " + item);
                    }
                }      
            } 
        }
        

        结果如下:

        productsMap 不包含名为 Apple 的键

        productsMap 不包含名为 Squash 的键

        productsMap 包含一个名为 fruits 的键

        搜索关键水果的列表值..

        productMap 的 key fruits 下的列表包含 Apple 项

        productMap 的 key fruits 下的列表不包含 item Squash

        productMap 的 key fruits 下的列表不包含项目 fruits

        搜索关键蔬菜的列表值..

        productMap 在 key veggies 下的列表不包含 Apple 项

        productMap 的 key veggies 列表包含 item Squash

        productMap 的 key veggies 列表不包含项目 fruits

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-11
          • 2012-08-14
          • 2021-01-24
          • 2018-10-03
          • 2021-02-14
          • 2015-11-29
          • 2010-10-17
          相关资源
          最近更新 更多