15

が でHashMapあり、が で表される次のものがあります。keyStringvalueArrayList

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

私のアプリケーションには別のArrayList<String> foods実装もあります。

私の質問は、my secondHashMapの Specific が含まれているかどうかを確認する最良の方法は何ですか?StringArrayList

私は成功せずに試しました:

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

7 に答える 7

18

なぜだめですか:

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

ArrayList<String>また、特定の値を 1 つだけ探すのではなく、全体を反復処理する必要がある場合は、次のようにします。

// 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)
    )
于 2013-08-22T19:25:01.310 に答える
9

containsKey()メソッドを使用する必要があります。これを行うには、キーを取り出したい hashMap を取得し、containsKeyメソッドを使用します。メソッドは値を返すboolean場合に値を返します。これにより、各アイテムを反復処理することなく、hashMap 全体が検索されます。キーを持っている場合は、単純に値を取得できます。

次のようになります。

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

アンドロイドへのリンクはこちら

Android ドキュメントから:

public boolean containsKey (オブジェクトキー) API レベル 1 で追加

このマップに指定されたキーが含まれているかどうかを返します。パラメータ key 検索するキー。戻り値

true if this map contains the specified key, false otherwise.
于 2013-08-22T19:26:58.570 に答える
3
hashMap.containsValue("your value");

HashMap に値が含まれているかどうかを確認します

于 2017-01-07T22:29:24.510 に答える
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;
}
于 2013-08-22T19:33:59.233 に答える
1

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

どちらもほぼ同じ結果になるはずです。

于 2013-08-22T19:31:54.283 に答える
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);
        }
}
于 2013-08-22T19:31:47.953 に答える
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 に Apple という名前のキーが含まれていません

productsMap に Squash という名前のキーが含まれていません

productsMap には、fruits という名前のキーが含まれています

主要な果物のリスト値を検索しています..

主要な果物の下のproductMapのリストには、Appleのアイテムが含まれています

主要な果物の下のproductMapのリストには、スカッシュのアイテムが含まれていません

主要な果物の下のproductMapのリストには、アイテムの果物が含まれていません

主な野菜のリスト値を検索しています..

key veggies の下の productMap のリストに項目 Apple が含まれていません

主要な野菜の下にあるproductMapのリストには、項目Squashが含まれています

key veggies の下の productMap のリストに項目の果物が含まれていません

于 2013-08-22T20:00:16.327 に答える