为什么所有东西都从我的数组列表中删除了?

Spa*_*onk 4 java string loops substring arraylist

我试图回答这个问题:

对 findIngredients 方法进行编程。该方法接受一个名为 foodInStock 的字符串和一个名为成分的字符串数组列表。该方法应返回在 foodInStock 中未找到的成分的 ArrayList。

例如,如果:

foodInStock = “tomatopotatocornturkeycarrotstuffing”

ingredients = {“potato”, “corn”, “salt”, “chicken”, “turkey”}
Run Code Online (Sandbox Code Playgroud)

返回{“盐”,“鸡”}

我尝试编写一些代码,但由于某种原因,当我在我的程序中使用上面的示例时,所有内容都被删除了。我的程序哪里出错了?

这是我的代码:

public static ArrayList<String> findIngredients(String foodInStock, ArrayList<String> ingredients){
    ArrayList<String> ingredientsNotFound = new ArrayList<String>();
    int i = 0;
    for (; i < ingredients.size(); i++) {
        for (int x = 0; x < foodInStock.length()-(ingredients.get(i).length())+1; x++) {
            if (ingredients.get(i) == foodInStock.substring(x, (x + ingredients.get(i).length()))) {
                ingredients.remove(i);
                i = 0;
                break;
            }
        }
    }
    ingredients = ingredientsNotFound;
    return ingredientsNotFound;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_* P. 5

我认为这里有两个主要内容。

首先,构建最终结果的方式。您当前正在从原始输入中删除项目;更好的策略是将项目添加到新列表中(部分原因是考虑起来更简单,部分原因是您通常不想在迭代列表时修改列表)。

您也可能不小心在最后用一个空列表覆盖了您的列表。

二、判断该成分是否在字符串输入中的方法。您可以使用该indexOf()方法查看字符串是否包含当前项,而不是遍历整个字符串并检查子字符串。

public static ArrayList<String> findIngredients(String foodInStock, ArrayList<String> ingredients) {
    ArrayList<String> results = new ArrayList<>();
    for (String ingredient : ingredients) {
        if (foodInStock.indexOf(ingredient) == -1) {
            results.add(ingredient);
        }
    }
    return results;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们为结果初始化一个新列表。然后我们遍历输入列表中的每个单独成分,并询问该成分是否存在于字符串输入中。如果不是(indexOf()返回-1),我们将其添加到结果列表中。最后,结果包含未找到的所有成分。