как извлечь элемент из списка массивов, который является параметром конструктора - PullRequest
0 голосов
/ 27 января 2020

У меня есть класс пунктов меню, в котором перечислены цены, описание и категории. Я хочу, чтобы категории были в списке массивов, так что есть только 3 на выбор. Я не уверен, как поместить это в мой конструктор l или извлечь эту информацию.

Пример: вот мои поля и конструктор для пунктов меню

private double price;
private String description;
private ArrayList<String> category = new ArrayList<>(Arrays.asList("Appetizer", "Main Course", "Dessert"));

//set constructor
public MenuItem(double price, String description, ArrayList<String> category){
    this.price = price;
    this.description = description;
    this.category = category;
    //do i not put the arraylist into my constructor or is this is correct?  
}

я знаю, хочу ли я чтобы получить цену из пункта меню, я делаю это так

    MenuItem lobsterRisotto = new MenuItem(14.99, "Lobster pasta in buttery red sauce");

    //print the price of lobster risotto
    System.out.println(lobsterRisotto.getPrice());

, но я не уверен, как получить указанную категорию c от массива

Ответы [ 5 ]

1 голос
/ 27 января 2020

Вы можете определить несколько конструкторов.

Вы назначаете значения по умолчанию, когда определяете строки, такие как:

private ArrayList<String> category = new ArrayList<>(Arrays.asList("Appetizer", "Main Course", "Dessert"));

Вот пример, который иллюстрирует поведение с несколькими конструкторами:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Collectors;

public class MenuItem {
    private double price;
    private String description;
    private ArrayList<String> category = new ArrayList<>(Arrays.asList("Appetizer", "Main Course", "Dessert"));

    public MenuItem(double price, String description) {
        this.price = price;
        this.description = description;
    }

    public MenuItem(double price, String description, ArrayList<String> category) {
        this.price = price;
        this.description = description;
        this.category = category;
    }

    public double getPrice() {
        return price;
    }

    public ArrayList<String> getCategory() {
        return category;
    }

    public static void main(String... args) {
        MenuItem lobsterRisotto1 = new MenuItem(14.99, "Lobster pasta in buttery red sauce - sample 1");
        MenuItem lobsterRisotto2 = new MenuItem(
                29.99,
                "Lobster pasta in buttery red sauce - sample2",
                new ArrayList<>(Arrays.asList("category1", "category2", "category3")));

        // output: 14.99
        System.out.println(lobsterRisotto1.getPrice());
        // output: 29.99
        System.out.println(lobsterRisotto2.getPrice());

        // output: Appetizer, Main Course, Dessert
        System.out.println(lobsterRisotto1.getCategory().stream().collect(Collectors.joining(", ")));

        // output: category1, category2, category3
        System.out.println(lobsterRisotto2.getCategory().stream().collect(Collectors.joining(", ")));
    }
}
1 голос
/ 27 января 2020

Нет необходимости использовать ArrayList, если предполагается, что он содержит три и только три возможных значения. Просто используйте stati c final Sting array. А еще лучше, используйте enum.

Тогда ваш конструктор должен иметь в качестве параметра String (или значение enum) (не ArrayList), и он должен проверить, что это значение является одним из трех допустимых значений в категориях. , Если вы используете enum, эта проверка будет выполнена автоматически.

0 голосов
/ 27 января 2020

Поскольку вы не будете передавать список в конструкторе (только тип), добавление категории было бы неправильным. Я бы сказал, сделать список массивов категорий глобальной переменной, а затем использовать это.

0 голосов
/ 27 января 2020

Есть несколько способов получить желаемое поведение, я предлагаю не использовать List<String> для хранения допустимых категорий пунктов меню. Вы можете легко сделать это, используя Enum , и это также даст возможность выполнять действия с данным типом, если это необходимо.

enum MenuCategory {
    APPETIZER("Appetizer"),
    MAIN_COURSE("Main Course"),
    DESSERT("Dessert");

    private final String displayName;

    MenuCategory(final String displayName) {
        this.displayName = displayName;
    }

    public final String getDisplayName() {
        return displayName;
    }
}

Затем я использовал бы базовый абстрактный класс и создал бы подклассы для каждого типа. Это обеспечит создание каждого созданного элемента MenuItem с правильной категорией, а также даст вам возможность выполнять действия, указанные c для подкласса. Пример абстрактного класса Информация о наследовании

abstract static class MenuItem {
    protected final double price;
    protected final String description;
    protected final MenuCategory category;

    public MenuItem(final double price, final String description, final MenuCategory category) {
        this.price = price;
        this.description = description;
        // Protect against a subclass being made that does not pass in a MenuCategory value.
        this.category = Objects.requireNonNull(category);
    }

    public final double getPrice() {
        return price;
    }

    public final String getDescription() {
        return description;
    }

    public final MenuCategory getCategory() {
        return category;
    }

    @Override
    public final String toString() {
        return category.getDisplayName() + ": " + description + " " + price;
    }
}

static class AppetizerItem extends MenuItem {
    public AppetizerItem(final double price, final String description) {
        super(price, description, MenuCategory.APPETIZER);
    }
}

static class MainCourseItem extends MenuItem {
    public MainCourseItem(final double price, final String description) {
        super(price, description, MenuCategory.MAIN_COURSE);
    }
}

static class DessertItem extends MenuItem {
    public DessertItem(final double price, final String description) {
        super(price, description, MenuCategory.DESSERT);
    }
}

И, наконец, для создания элемента MenuItem вы можете сделать

MenuItem lobsterRisotto = new MainCourseItem(14.99, "Lobster pasta in buttery red sauce");

//print the price of lobster risotto
System.out.println(lobsterRisotto.getPrice());
0 голосов
/ 27 января 2020

Чтобы получить доступ к указанному c элементу списка массивов, вот что я сделал

в моем геттере, я возвращаю строку, потому что это тип элемента, который я пытаюсь получить и установить параметр получателя к int для доступа к этому номеру индекса

    public String getCategory(int i) {
        return category.get(i);

, а затем для доступа к указанному индексу c из экземпляра, который я создал в main (для этого примера это была закуска в позиции индекса 0 массива) i б

1007 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...