2D массив, возвращающий несовместимые типы с использованием шаблона итератора

#java #arrays #multidimensional-array

#java #массивы #многомерный массив

Вопрос:

Я пытаюсь создать 2D-массив. Для хранения продуктов питания со значениями. Я знаю, что делаю что-то не так, кто-нибудь может это увидеть?

 public class FoodMenu implements Menu {

    static final int MAX_ITEMS = 6;
    int numberOfItems = 0;
    String[][] foodItems;

    public FoodMenu() {
        foodItems = new String[MAX_ITEMS][];
    
        addItem("Vegetarian BLT","Test");
        addItem("BLT","Test");
        addItem("Soup of the day","Test");
}

public FoodMenuIterator(String[][] items) {
        this.items = items;
    }

public void addItem(String name, String value) {
        if (numberOfItems >= MAX_ITEMS) {
            System.err.println("Sorry, menu is full!  Can't add item to menu");
        } 
        else {
            foodItems[numberOfItems][3] = name;
            numberOfItems = numberOfItems   1;
        }
    }

    @Override
    public boolean hasNext() {
        if (position >= items.length || items[position] == null) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public Object next() {
        String menuItem = items[position]; ---**//The issue is here**---
        position = position   1;
        return menuItem;
    }
 

Проблема выше в прокомментированной строке. Ошибка появляется как несовместимые типы: String[] не может быть преобразован в String . Моя цель — добавить тип питания и значение в виде строки в 2d массив.

Как мне исправить эту ошибку? Я пытался указать «String MenuItem = items[position] []; и т.д., чтобы не иметь решения». Есть идеи?

Комментарии:

1. это должно быть String menuItem = items[position][someIndex] или String[] menuItem = items[position]; в зависимости от того, чего вы хотите достичь

2. Что addItem делать? Что именно говорит stacktrace?

3.Похоже items , что это 2D массив, поэтому, принимая значение в индексе [position] , будет возвращен 1D массив, но вы пытаетесь присвоить этому массиву String menuItem = .. . Чтобы лучше понять это, взгляните на 2d массив, подобный int[][] numbers2D = { {1,2}, {3,4} } . Если вы используете numbers2D[1] его, он вернет {3,4} 1D массив, поэтому вы не сможете сделать что-то вроде int num = numbers2D[1]; (какое значение должно num содержать: 3 или 4 или, может быть, что-то еще? Такая вещь не указана, поэтому не допускается на языке Java). Что вы можете сделать, так это выбрать некоторый элемент из этого 1d-массива, numbers2D[1][0] который будет возвращен 3 .

4. @Buti’Mnotawrapperclass его для добавления в массив. Я пытаюсь научиться выполнять шаблон итератора с массивами.

Ответ №1:

вы хотите наследовать от итератора Java по умолчанию, иначе вы ничего не переопределяете. компилятор считает, что position является локальной переменной.

Комментарии:

1. Реализация OP Menu @Override относится к методам интерфейса

2. мой плохой, я бы сделал тогда итератор отдельным классом, который наследует итератор java.

3. да, потому что позиция нигде не определена. вы хотите превратить итератор в класс и включить в него все эти функции. заставьте итератор расширить итератор java.