Как найти минимальную цену на заданный товар коллекции с помощью типизированного итератора?

128
30 апреля 2019, 18:00

Есть четыре класса. Первый класс товаров.

class Good {
    String name;
    double price;
    public Good(String name, double price) {
        this.name = name;
        this.price = price;
    }
}

Второй класс магазин.

class OnlineStore {
    String name;
    List<Good> goods;
    public OnlineStore(String name, List<Good> list) {
        this.name = name;
        this.goods = list;
    }
}

Третий класс сервис поиска товаров.

class ProductSearchSrvice {
    List<OnlineStore> store;
    public ProductSearchSrvice(List<OnlineStore> store) {
        if(store.isEmpty()) {
            throw new IllegalArgumentException();
        }
    }
}

И последний класс, где все происходит.

public static void main(String[] args) {
        Good Tuner = new Good("Tuner", 350.0);
        Good Cable_HDMI = new Good("Cable HDMI", 29.6);
        Good Control_panel = new Good("Cable HDMI", 150.5);
        Good Tuner_1 = new Good("Tuner", 1323.0);
        Good Cable_HDMI_1 = new Good("Control_panel", 470.0);
        Good Control_panel_1 = new Good("Control_panel", 617.0);
        Good Tuner_2 = new Good("Tuner", 567.89);
        Good Cable_HDMI_2 = new Good("Cable_HDMI", 249.5);
        Good Control_panel_2 = new Good("Control_panel", 850.0);
        ArrayList listOfMirElectroniki = new ArrayList();
        ArrayList listOfHIKVISION = new ArrayList();
        ArrayList listOfOLX = new ArrayList();
        listOfMirElectroniki.add(Tuner);
        listOfMirElectroniki.add(Cable_HDMI);
        listOfMirElectroniki.add(Control_panel);
        listOfHIKVISION.add(Tuner_1);
        listOfHIKVISION.add(Cable_HDMI_1);
        listOfHIKVISION.add(Control_panel_1);
        listOfOLX.add(Tuner_2);
        listOfOLX.add(Cable_HDMI_2);
        listOfOLX.add(Control_panel_2);
        OnlineStore MirElecroniki = new OnlineStore("Mir Electroniki", listOfMirElectroniki);
        OnlineStore HIKVISIOB = new OnlineStore("HIKVISION", listOfHIKVISION);
        OnlineStore OLX = new OnlineStore("OLX", listOfOLX);
}

Как это сделать?

Answer 1
  1. Не используйте raw types в дженериках, Вместо ArrayList someList = new ArrayList(); пишите ArrayList<Good> someList = new ArrayList<>();
  2. В конструкторе ProductSearchService после проверки на пустоту списка, все же сделайте присвоение this.store = store;
  3. Также сделайте все поля в своих классах private и добавьте get методы для них
  4. Ну и сам метод поиска минимальной цены по товару (с использованием стримов):

    public double findMinPriceByGoodName(String goodName) {
        return store.stream()
            .flatMap(onlineStore -> onlineStore.getGoods().stream())
            .filter(good -> good.getName().equals(goodName))
            .min(Comparator.comparing(Good::getPrice)).get().getPrice();
    }
  5. Если стримы сложно, вот тот же метод с циклом:

    public double findMinPriceByGoodName(String goodName) {
        double result = 0;
        for (OnlineStore onlineStore : store) {
            for (Good good : onlineStore.getGoods()) {
                if (good.getName().equals(goodName)) {
                    if (good.getPrice() < result || result == 0) {
                        result = good.getPrice();
                    }
                }
            }
        }
        return result;
    }
  6. Если есть требование сделать именно с помощью Iterator (что конечно менее читаемо и не рекомендуется для использования), в целях изучения например, то вот с итератором:

    public double findMinPriceByGoodName(String goodName) {
        double result = 0;
        for (Iterator<OnlineStore> iterator = store.iterator(); iterator.hasNext(); ) {
            OnlineStore onlineStore = iterator.next();
            for (Iterator<Good> iterator1 = onlineStore.getGoods().iterator(); iterator1.hasNext(); ) {
                Good good = iterator1.next();
                if (good.getName().equals(goodName)) {
                    if (good.getPrice() < result || result == 0) {
                        result = good.getPrice();
                    }
                }
            }
        }
        return result;
    }

Теперь создаем наш сервис (не забыв передать в конструктор список магазинов) и вызываем метод:

List<OnlineStore> stores = new ArrayList<>();
stores.add(MirElecroniki);
stores.add(HIKVISIOB);
stores.add(OLX);
ProductSearchService service = new ProductSearchService(stores);
double minPrice = service.findMinPriceByGoodName("Tuner");
System.out.println("Min price for Tuner" + minPrice);
READ ALSO
Копии класса, их объявление Java

Копии класса, их объявление Java

Я новичок в java, пытаюсь сделать многопользовательскую игруСервер, клиент есть, проблема в другом

160
Вопрос по потокам в Java

Вопрос по потокам в Java

Есть класс Clock, наследуемый от Thread с методом run()

121
Помогите правильно указать путь к файлу

Помогите правильно указать путь к файлу

Положил изображение в папку "res", но не получается его подгрузитьПри сборке jar файла изображение не отображается

162
collection framework java

collection framework java

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

161