Заранее прошу прощения за избыток коментариев в коде. Тестировал как мог. Но пункт 3 непобедим. Вот просто неподедим.
Сперва действительно неправильно реализовал алгоритм рюкзака. (Жадный с сортировкой). Переписал заново. На тестовых значениях алгоритм отработал отлично.
Тестовые значение:
ads.add(new Ad("1", 120, 10, 4)); - в отборе
ads.add(new Ad("2", 10, 10, 2));
ads.add(new Ad("3", 4, 2, 2));
ads.add(new Ad("4",40, 10, 10)); - в отборе
ads.add(new Ad("5", 2, 2, 1)); - в отборе
ads.add(new Ad("6", 1, 1, 1));
максимум по стоимости - 17, максимум по весу - 15
ads.add(new Ad("400-1600", 1600, 1, 400)); - в отборе
ads.add(new Ad("300-1500", 1500, 1, 300)); - в отборе
ads.add(new Ad("100-700", 700, 1, 100));
ads.add(new Ad("200-1200", 1200, 1, 200)); - в отборе
ads.add(new Ad("500-1500", 1500, 1, 500));
максимум по деньгам - 4300, максимум по весу - 900
Из рекомендаций перепробовал многое:
- убрал интерфейс из класа рекламы, реализовал посредством лямбды компаратор в теле метода обработки видео;
- добавил перепроверки на количество проигрываний. в случае если нечего показывать - вылета не будет;
- перебрал вывод (авось оно каждую букву проверяет). Вывод как в "правильном коде";
- посмотрел где в процес видео в "правильном" коде находиться проверка на пустоту и возможность попадания с хитс меньше нуля - сделал также.
Поэтому прежде чем забить на капризы валидатора (а он тут реально упоротый) и просто скопировать все, что касается показа рекламы с "правильного" кода, хотел просто чтобы может кто свежим взглядом прошелся по моему коду. Может пропустил что-то глупое....
ПыСы: Администрация, неужели вам не понятно что ваши тестовые методы нужно переписать и\или сделать понятным условие, котрое проверяется в этом пункте 3?
Или может наконец реализовать вывод ваших тестовых методов как на codewars?..
package com.javarush.task.task27.task2712;
import com.javarush.task.task27.task2712.ad.Advertisement;
import com.javarush.task.task27.task2712.ad.AdvertisementManager;
import com.javarush.task.task27.task2712.kitchen.Cook;
import com.javarush.task.task27.task2712.kitchen.Waiter;
import com.javarush.task.task27.task2712.statistic.StatisticManager;
import com.javarush.task.task27.task2712.statistic.event.VideoSelectedEventDataRow;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
public class Restaurant
{
//TODO coment this
//private static Clock clock = Clock.fixed(Instant.now(), ZoneId.systemDefault());
public static void main(String[] args)
{
/*Tablet tablet1 = new Tablet(1);
Tablet tablet2 = new Tablet(2);
Cook heisenberg = new Cook("Heisenberg");
Cook pinkman = new Cook("Pinkman");
Waiter waiter = new Waiter();
tablet1.addObserver(heisenberg);
heisenberg.addObserver(waiter);
tablet2.addObserver(pinkman);
pinkman.addObserver(waiter);
// "Сегодня":
tablet1.createOrder();
tablet1.createOrder();
tablet2.createOrder();
// "Завтра":
Instant instant = Instant.now().plusSeconds(3600 * 24);
clock = Clock.fixed(instant, ZoneId.systemDefault());
tablet1.createOrder();
tablet1.createOrder();
tablet1.createOrder();
// "Послезавтра":
instant = Instant.now().plusSeconds(3600 * 24 * 2);
clock = Clock.fixed(instant, ZoneId.systemDefault());
tablet1.createOrder();
tablet2.createOrder();
tablet2.createOrder();
DirectorTablet directorTablet = new DirectorTablet();
directorTablet.printAdvertisementProfit();
directorTablet.printCookWorkloading();
directorTablet.printActiveVideoSet();
directorTablet.printArchivedVideoSet();*/
Tablet tablet = new Tablet(5);
Cook cook = new Cook("Amigo");
Waiter waiter = new Waiter();
tablet.addObserver(cook);
cook.addObserver(waiter);
tablet.createOrder();
tablet.createOrder();
tablet.createOrder();
tablet.createOrder();
DirectorTablet directorTablet = new DirectorTablet();
directorTablet.printAdvertisementProfit();
directorTablet.printCookWorkloading();
directorTablet.printActiveVideoSet();
directorTablet.printArchivedVideoSet();
/*Tablet tablet = new Tablet(1);
Cook cook = new Cook("Garson");
Waiter waiter = new Waiter();
tablet.addObserver(cook);
cook.addObserver(waiter);
tablet.createOrder();
tablet.createOrder();
tablet.createOrder();
tablet.createOrder();
DirectorTablet directorTablet = new DirectorTablet();
directorTablet.printAdvertisementProfit();
directorTablet.printCookWorkloading();
directorTablet.printActiveVideoSet();
directorTablet.printArchivedVideoSet();*/
}
/* public static long getTime()
{
return clock.millis();
}*/
}