почему все удаляется из моего архива? - PullRequest
4 голосов
/ 11 января 2020

Я пытаюсь ответить на этот вопрос:

Запрограммируйте метод findIngredients. Этот метод принимает String с именем foodInStock и ArrayList of Strings, называемые ингредиенты. Метод должен возвращать ArrayList ингредиентов, которые не были найдены в foodInStock.

, например, если:

foodInStock = “tomatopotatocornturkeycarrotstuffing”

ingredients = {“potato”, “corn”, “salt”, “chicken”, “turkey”}

возвращает {"соль", "курица"}

Я попытался написать некоторый код, но по какой-то причине все удаляется, когда я использую приведенный выше пример в своей программе. Где моя программа go не так?

Вот мой код:

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

1 Ответ

4 голосов
/ 11 января 2020

Я думаю, что здесь есть две основные вещи.

Во-первых, способ получить конечный результат. В настоящее время вы удаляете элементы из исходного ввода; лучшей стратегией является добавление элементов в новый список (частично потому, что об этом проще думать, а частично потому, что вы, как правило, не хотите изменять список во время итерации по нему).

Вы также, вероятно, случайно , перезаписывая ваш список пустым списком в конце.

Во-вторых, способ определить, находится ли ингредиент в строке ввода. Вместо того, чтобы зацикливаться на всей строке и проверять подстроки, вы можете вместо этого использовать метод 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;
}

Здесь мы инициализируем новый список результатов , Затем мы проводим l oop по каждому отдельному ингредиенту в списке ввода и спрашиваем, присутствует ли этот ингредиент в строке ввода. Если это не так (indexOf() возвращает -1), мы добавляем его в список результатов. В конце результаты содержат каждый не найденный ингредиент.

...