我是一名新手编码器,试图教自己如何编码。我正在尝试创建一个程序,该程序存储具有相应成分的配方列表,然后根据用户输入的成分建议配方。我使用带字符串键的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);
}
}
}
答案 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#of
和List#of
的调用替换为{{ 1}},但效率会降低。