Может кто-то объяснить код построчно? [закрыт]

216
30 апреля 2019, 16:00

Это часть большого кода, в котором есть три четыре класса: OnlineStore, Good, ProductSearchSrvice и класс, где происходят основные действия и, где находиться код ниже), выполняет поиск минимальной цены заданного товара.

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);
Answer 1
public double findMinPriceByGoodName(String goodName) {
    // Минимально возможная цена
    double result = 0;
    // Создаем итератор коллекции store и перебираем его в for, пока есть значения `hasNext()` вернет
    //  false если значений не будет
    for (Iterator<OnlineStore> iterator = store.iterator(); iterator.hasNext(); ) {
        // Вытаскиваем из итератора значение
        OnlineStore onlineStore = iterator.next();
        // Создаем итератор коллекции onlineStore.getGoods() и перебираем его
        for (Iterator<Good> iterator1 = onlineStore.getGoods().iterator(); iterator1.hasNext(); ) {
            // Вытаскиваем значение
            Good good = iterator1.next();
            // Если название товара такое же, которое было передано в функцию (аргумент goodName)
            if (good.getName().equals(goodName)) {
                // Если цена товара меньше текущей минимальной или текущая минимальная равна 0 
                // (думаю, условие с result == 0 нужно чтобы обновить значение в result в случае, 
                // когда первый товар имеет цену выше значения в result по умолчанию -- выше 0,
                // чтобы иметь реальную цену.
                if (good.getPrice() < result || result == 0) {
                    // Обновляем текущую минимальную цену
                    result = good.getPrice();
                }
            }
        }
    }
    // Возвращаем результат
    return result;
}

Код можно упростить, если вместо итераторов+for использовать foreach:

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

Можно нахождение минимальной цены сделать без условий:

public double findMinPriceByGoodName(String goodName) {
    Set<Integer> prices = new HashSet<>();        
    // Или:
    // List<Integer> prices = new ArrayList<>();
    for (OnlineStore onlineStore : store) {
        for (Good good : onlineStore.getGoods()) {
            if (good.getName().equals(goodName)) {
                prices.add(good.getPrice());
            }
        }
    }
    return Collections.min(prices);
}
READ ALSO
Java взаимодействие потоков

Java взаимодействие потоков

возник такой вопрос Почему у меня поток, который я передаю в классе CalculateThread не возобновляет свою работу, когда метод run() выполнился

179
Не запускается код Java

Не запускается код Java

Доброе утро, товарищи программисты!

187
LibGDX обработка нажатий

LibGDX обработка нажатий

Некорректная работа InputProcessor на андроиде версии выше 51 (судя по проведенным тестам)

203
Ошибка при десериализации JSON с помощью Jersey

Ошибка при десериализации JSON с помощью Jersey

Пока разбираюсь именно с Jersey, поэтому не предлагайте другие библиотеки

202