markknaap
markknaap

Reputation: 19

Java - using Map how to find matching Key when Values are stored a List of strings

All,

I have a map with categories and subcategories as lists like this:

    Map<String,List<String>> cat = new HashMap<String,List<String>>();

    List<String> fruit = new ArrayList<String>();
    fruit.add("Apple");
    fruit.add("Pear");
    fruit.add("Banana");

    cat.put("Fruits", fruit);

    List<String> vegetable = new ArrayList<String>();
    vegetable.add("Carrot");
    vegetable.add("Leak");
    vegetable.add("Parsnip");

    cat.put("Vegetables", vegetable);

I want to find if "Carrot" is in the map and to which key ("Fruit') it matches, however:

    if (cat.containsValue("Carrot")) {System.out.println("Cat contains Leak");}

gives False as outcome. How can I match "Carrot" and get back the key value "Vegetable"

Thx.

Upvotes: 1

Views: 3675

Answers (4)

hari
hari

Reputation: 1963

try this,

for (Map.Entry<String, List<String>> entry : cat.entrySet()) {
        String names[] = entry.getValue().toArray(new String[entry.getValue().size()]);
        for (int i = 0; i < names.length; i++) {
            if (names[i].equals("Carrot")) {
                System.out.println("found"+names[i]);
                break;
            } 
        }

    }

Upvotes: -1

Braj
Braj

Reputation: 46871

Iterate thought all the keys and check in the value if found then break the loop.

for (String key : cat.keySet()) {
    if (cat.get(key).contains("Carrot")) {
        System.out.println(key + " contains Carrot");
        break;
    }
}

Upvotes: 1

Juvanis
Juvanis

Reputation: 25950

You have to search for the value in the entire map:

for (Entry<String, List<String>> entry : cat.entrySet()) {
    for (String s : entry.getValue()) {
        if (s.equals("Carrot"))
            System.out.println(entry.getKey());
    }
}

Upvotes: 0

Jean Logeart
Jean Logeart

Reputation: 53859

You need to create the inversed map:

Map<String, String> fruitCategoryMap = new HashMap<>();
for(Entry<String, List<String>> catEntry : cat.entrySet()) {
    for(String fruit : catEntry.getValue()) {
        fruitCategoryMap.put(fruit, catEntry.getKey());
    }
}

Then you can simply do:

String category = fruitCategoryMap.get("Banana"); // "Fruit"

Upvotes: 2

Related Questions