Как добавить элементы из нескольких массивов в новый статический массив без ArrayList?

Для школьного задания я успешно создал программу, в которой хранятся рецепты (название, ингредиенты, инструкции). Теперь мне нужно добавить функцию списка покупок, которая будет брать ингредиенты из рецептов, которые я добавил, и сохранять их в новом массиве статических строк.

Мне потребовалось создать массив строк ингредиентов размером 20 и список покупок в виде статического массива строк размером 40:

private String[] ingredients = new String[20];
private static String[] shoppingList = new String[40]; 

Я инициализировал все элементы обоих массивов пустой строкой.

Я также жестко закодировал два рецепта в своей тестовой программе, например:

rcp1.setIngredients(0, "Butter");
rcp1.setIngredients(1, "Garlic");
rcp1.setIngredients(2, "Parsley");
rcp1.setIngredients(3, "Bread");
rcp1.setIngredients(4, "Cheese");

rcp2.setIngredients(0, "Biscuits");
rcp2.setIngredients(1, "Pepperoni");
rcp2.setIngredients(2, "Pizza sauce");

Вот тут я запутался:

public void setIngredients(int loc, String ingredient) {
    ingredients[loc] = ingredient;

        for (int i=0; i<shoppingList.length; i++){
            if (shoppingList[loc] == "") {
            shoppingList = ingredients;
            } 
        }      
}

Поскольку ингредиенты rcp1 и rcp2 используют местоположения ингредиентов [0, 1, 2], попытка добавить ингредиент в статический список покупок с использованием [loc] приводит к перезаписи этих местоположений первого рецепта.

Я создал цикл for, чтобы он правильно отображал ингредиенты первого рецепта; однако я не уверен, как затем перейти к поиску местоположения следующей пустой строки, чтобы перечислить ингредиенты второго рецепта. Я думал, что мне придется использовать оператор else if, а затем найти способ найти, где находится следующая пустая строка, чтобы я мог начать добавлять ингредиенты следующего рецепта с этой точки..?

Есть ли другой, возможно, более простой способ взять ингредиенты из rcp2 и поместить их после ингредиентов rcp1 в shoppingList?

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


person Kiko    schedule 27.04.2016    source источник
comment
Какова цель вашей функции setIngredients()? Цикл for внутри бесполезен — вы не используете переменную итерации i внутри тела.   -  person Mifeet    schedule 27.04.2016
comment
То, что вы говорите, звучит для меня так, что вам просто нужно объединить ингредиенты обоих рецептов в другой массив shoppingList, это правильно?   -  person Mifeet    schedule 27.04.2016


Ответы (1)


Вы сталкиваетесь с множеством искусственных ограничений, чего и следовало ожидать, поскольку это задание курса. Ваша главная проблема заключается в том, что, по-видимому, вы не знаете, сколько ингредиентов содержится в каждом рецепте или в списке покупок. Обычно размер массива соответствует содержимому, поэтому у вас будет количество элементов в arr.length. В противном случае можно было бы использовать один из классов в структуре коллекций, например ArrayList.

Однако вы используете буферы фиксированного размера, а это означает, что вам нужно отслеживать текущий размер вашего списка в дополнение к емкости, которую дает вам arr.length. Есть два способа сделать это:

  • Явно, имея переменную int, которая концептуально связана с массивом, что означает «первый неиспользуемый элемент». Когда вы добавляете новые элементы, вы начинаете с этого индекса и увеличиваете эту переменную для каждого нового ингредиента, добавляемого в список. Это то, что делает ArrayList.
  • Неявно, имея какую-то «маркерную» строку, которая означала бы «неиспользованный». Это может быть правильный экземпляр String или просто null. Это в основном то, что C делает с терминатором строки '\0'.

Каждый вариант имеет разные компромиссы и требует различной реализации, которую я не добавляю здесь, поскольку вам нужно подумать об этом как о части вашего курса! Не стесняйтесь спрашивать больше, если вы снова застряли.

person Javier Martín    schedule 27.04.2016