检查String数组是否包含另一个String数组的所有值(Java)

时间:2018-04-16 02:25:58

标签: java

我是一名新手编码器,试图教自己如何编码。我正在尝试创建一个程序,该程序存储具有相应成分的配方列表,然后根据用户输入的成分建议配方。我使用带字符串键的HashMap(用于配方名称)和String []来表示相应的成分。

我遇到的问题是,当用户输入成分(用逗号分隔)时,我似乎无法使用结果值来检查这些值是否包含在HashMap的相应值中。

当我尝试调用我的ingredientSearch()方法时,程序返回异常:"线程中的异常" main" java.lang.ClassCastException:[Ljava.lang.String;无法强制转换为java.lang.String     在RecipeBox.ingredientSearch(RecipeBox.java:55)。"

为什么这不起作用,我该如何解决这个问题呢?

import java.util.*;
import java.util.Map.Entry;

public class RecipeBox {

private String recipe;
private String name;
private String userInput;
private String randomRecipe;


Scanner input = new Scanner(System.in);
HashMap<String, String[]> recipes = new HashMap<String, String[]>();

public void addRecipe() {
    System.out.println("What is the name of your recipe?");
    name = input.nextLine();

    System.out.println("Enter the ingredients for " + name + " separated by commas:");
    recipe = input.nextLine();
    String[] ingredientList = recipe.split(",");

    recipes.put(name, ingredientList);

}

public void ingredientSearch() {

    System.out.println("What ingredients do you have?  Please enter your ingredients, separated by commas.");
    userInput = input.nextLine();
    String[] ingredientList = userInput.split(",");
    String check = ingredientList.toString();

    Iterator<Entry<String, String[]>> entries = recipes.entrySet().iterator();

    while (entries.hasNext()) {
        Entry entry = entries.next();
        String key = (String) entry.getKey();
        String value = (String) entry.getValue();
        if (value.contains(check)) {
            System.out.println("You could make " + key);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

String value = (String) entry.getValue();

应该是

String[] value = entry.getValue();

您的值是String数组。

答案 1 :(得分:0)

首先,您应该使用原始类型Entry,它应该是Entry<String, String[]>,因为这会阻止任何ClassCastException发生。接下来,您必须验证check中是否包含value的所有元素。一种简单的方法是将value转换为Set以便进行有效搜索:

List<String> ingredients = List.of(ingredientList);

while (entries.hasNext()) {
    Entry<String, String[]> entry = entries.next();

    String key = entry.getKey();
    String[] value = entry.getValue();

    if (Set.of(value).containsAll(ingredients)) {
        System.out.println("You could make " + key);
    }
}

注意:这将使用Java 9进行编译。如果您使用的是Java 8或更低版本,则可以将Set#ofList#of的调用替换为{{ 1}},但效率会降低。