2013-08-22 46 views
9

我有以下HashMap其中keyStringvalueArrayList表示:如何驗證是否在HashMap中的值存在

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

我也有我的應用程序實現的另一ArrayList<String> foods

我的問題是,如果我的HashMap包含我的第二個ArrayList的特定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); 
     } 
    } 
+0

是你的'關鍵'價值應該是特定的字符串? –

+0

是的。它應該是一個特定的字符串。 –

+0

'沒有成功'不是問題描述。 – EJP

回答

12

爲什麼不:

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

非常感謝! –

+0

不客氣:) – Mena

+0

我還有一些額外的疑問,如果「myString」值不完全知道,我只知道myStri。如何驗證或通過使用找到完整的值包含一些字符作爲「myStri」。你能幫助我嗎?@ Mena.or任何人 – goku

9

您需要使用containsKey()方法。要做到這一點,您只需獲取想要的密鑰的哈希映射,然後使用containsKey方法,如果它返回boolean值。這將搜索整個哈希映射,而不必遍歷每個項目。如果你有鑰匙,那麼你可以簡單地檢索這個值。

它看起來是這樣的:

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

這裏是鏈接到Android

從Android文檔:在API級別1

公共布爾的containsKey(對象鍵)

返回此映射是否包含指定的鍵。參數鍵 是搜索的關鍵。如果你想這樣做的Java的8路返回

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

爲什麼它命名containsKey而不是containsValue?如果目的是要知道它是否包含價值。 – aldok

+0

爲什麼不使用'productsMap。containsValue(「myKey」)' – Tim

+1

@aldok在你的問題中沒有關於查找值的問題。 – EJP

1

試試這個

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

,你可以做這樣的事情:

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

兩者都應該產生幾乎相同的結果。

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

下面是這兩種方案測試的樣品的方法。在地圖的鍵搜索項目,並在每個地圖項的列表中搜索項目:

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不包含名爲蘋果

productsMap關鍵不包含名爲Squash的密鑰

productsMap包含名爲fruits的密鑰

搜索的關鍵水果列表值..

productMap的下鍵水果列表包含商品Apple

productMap的下鍵水果列表中不包含的項目壁球

productMap的下鍵水果列表中不包含項目成果

上搜索鍵蔬菜列表值..

productMap的下鍵蔬菜列表中不包含商品Apple

productMap的下鍵蔬菜列表包含項目壁球

productMap的下鍵蔬菜列表中不包含的項目成果

1
hashMap.containsValue("your value"); 

將檢查HashMap中包含值

+0

沒有這樣的方法。 – EJP

+0

@EJP https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#containsValue(java.lang.Object) – Tim

相關問題