• ,

level27.lesson15.big01 задание 14

Уже пару дней сижу с этим заданием — перечитал все форумы, все что можно было варианты перепробовал. Может быть чего-то не замечаю — подскажите что можно поправить.

Задание 14

1. Внутри StatisticStorage создайте единственный метод void put(EventDataRow data).

2. Чтобы методом put(EventDataRow data) добавить объект data в данные карты, нужен тип события — EventType.
Будет правильно, если событие будет хранить в себе свой тип. Поэтому
2.1. в интерфейс EventDataRow добавь метод EventType getType()
2.2. реализуй этот метод в каждом классе-событии: CookedOrderEventDataRow, NoAvailableVideoEventDataRow, VideoSelectedEventDataRow

3. Сделай так, чтобы к методу void put(EventDataRow data) нельзя было доступиться за пределами класса StatisticManager.
Пользуйтесь особенностями вложенных классов.

Теперь остается растыкать вызовы StatisticManager-а в те места, которые генерируют события.

4. Зарегистрируйте событие для повара во время приготовления еды.
Добавьте геттер для поля dishes в класс Order, используйте его при создании события.

5. Зарегистрируйте событие «видео выбрано» перед его отображением.

AdvertisementManager
public class AdvertisementManager {
    private int timeSeconds;

    private final AdvertisementStorage storage = AdvertisementStorage.getInstance();

    public AdvertisementManager(int timeSeconds) {
        this.timeSeconds = timeSeconds;
    }

    public void processVideos() {
        List<Advertisement>videos = optimalVideo(powerList(storage.list()));
        int leftSec = timeSeconds;

        Collections.sort(videos, new Comparator<Advertisement>() {
            @Override
            public int compare(Advertisement o1, Advertisement o2) {
                int result = Long.compare(o1.getAmountPerOneDisplaying(), o2.getAmountPerOneDisplaying());
                if (result != 0) {
                    return -result;
                }
                long first = o1.getAmountPerOneDisplaying() * 1000 / o1.getDuration();
                long second = o2.getAmountPerOneDisplaying() * 1000 / o2.getDuration();

                return Long.compare(first, second);
            }
        });
        for (Advertisement advertisement : videos) {
            int q = advertisement.getDuration()/60;
            if (q > leftSec) {
                continue;
            }
            long sumAmount = 0;
            int sumDuration = 0;
            for(Advertisement a : videos){
                sumAmount += a.getAmountPerOneDisplaying();
                sumDuration += a.getDuration();
            }
            StatisticManager.getInstance().register(new VideoSelectedEventDataRow(videos,sumAmount,sumDuration));
            ConsoleHelper.writeMessage(String.format("%s  is displaying... %d, %d",
                    advertisement.getName(),
                    advertisement.getAmountPerOneDisplaying(),
                    advertisement.getAmountPerOneDisplaying() * 1000 / advertisement.getDuration()));

            leftSec -= q;
            advertisement.revalidate();
        }
        if(videos.size()<=0 || videos==null){
            StatisticManager.getInstance().register(new NoAvailableVideoEventDataRow(timeSeconds));
            throw new NoVideoAvailableException();
        }
    }
//поиск оптимального видео


StatisticManager
public class StatisticManager {
    private static StatisticManager ourInstance = new StatisticManager();

    private static StatisticManager.StatisticStorage storage = getInstance().new StatisticStorage();

    public static StatisticManager getInstance() {
        return ourInstance;
    }

    private StatisticManager() {

    }

    public void register(EventDataRow data){
        storage.put(data);
    }
    private class StatisticStorage{
        private Map<EventType, List<EventDataRow>> storage = new HashMap<>();

        public StatisticStorage() {
            for(EventType e : EventType.values()){
                storage.put(e, new ArrayList<EventDataRow>());
            }
        }
       private void put(EventDataRow data){
            storage.get(data.getType()).add(data);
        }
    }
}


Cook
public class Cook extends Observable implements Observer {
    private String name;
    @Override
    public void update(Observable o, Object arg) {
        Order order =(Order) arg;
        ConsoleHelper.writeMessage("Start cooking - " + arg + ", cooking time " + order.getTotalCookingTime() + "min");
        StatisticManager.getInstance().register(new CookedOrderEventDataRow(order.tablet.toString(),name,order.getTotalCookingTime()*60,order.getDishes()));
        setChanged();
        notifyObservers(arg);

    }

    public Cook(String name) {
       this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}


CookedOrderEventDataRow
public class CookedOrderEventDataRow implements EventDataRow {
    private String tabletName;
    private String cookName;
    private int cookingTimeSeconds;
    private List<Dish> cookingDishs;
    Date currentDate;

    public CookedOrderEventDataRow(String tabletName, String cookName, int cookingTimeSeconds, List<Dish> cookingDishs) {
        this.tabletName = tabletName;
        this.cookName = cookName;
        this.cookingTimeSeconds = cookingTimeSeconds;
        this.cookingDishs = cookingDishs;
        this.currentDate = new Date();
    }
    @Override
    public EventType getType() {
        return EventType.COOKED_ORDER;
    }
}


NoAvailableVideoEventDataRow
public class NoAvailableVideoEventDataRow implements EventDataRow {
    private int totalDuration;
    Date currentDate;

    public NoAvailableVideoEventDataRow(int totalDuration) {
        this.totalDuration = totalDuration;
        this.currentDate = new Date();
    }

    @Override
    public EventType getType() {
        return EventType.NO_AVAILABLE_VIDEO;
    }
}


VideoSelectedEventDataRow
public class VideoSelectedEventDataRow implements EventDataRow {
    private List<Advertisement> optimalVideoSet;
    private long amount;
    private int totalDuration;
    Date currentDate;

    public VideoSelectedEventDataRow(List<Advertisement> optimalVideoSet, long amount, int totalDuration) {
        this.optimalVideoSet = optimalVideoSet;
        this.amount = amount;
        this.totalDuration = totalDuration;
        this.currentDate = new Date();
    }

    @Override
    public EventType getType() {
        return EventType.SELECTED_VIDEOS;
    }
}

2 комментария

qweasdzxc
У тебя событие VideoSelectedEventDataRow регистрируется в цикле for, получается что сколько видео в блоке столько сработает регистрация, а надо регистрировать одно событие на все видео во время приготовления еды. Покажи ещё что у тебя в классе Tablet
dwajot
Спасибо тебе большое! Именно в этом и была крыса зарыта! Мне после длительного перерыва сложно было снова вникать в эту задачу, но я порешал:)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.