• ,

com.javarush.task.task27.task2712 Задание 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. Зарегистрируй событие «видео выбрано» перед отображением рекламы пользователю.

6. Метод register с одним параметром типа EventDataRow должен регистрировать полученное событие в statisticStorage.



import com.javarush.task.task27.task2712.statistic.event.EventDataRow;
import com.javarush.task.task27.task2712.statistic.event.EventType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StatisticManager
{
private static StatisticManager instance = new StatisticManager();
private StatisticStorage statisticStorage = new StatisticStorage();
private StatisticManager()
{
}
public static StatisticManager getInstance()
{
return instance;
}
public void register(EventDataRow data)
{
statisticStorage.put(data);
}
private static class StatisticStorage
{
private Map<EventType, List> storage = new HashMap<>();
private StatisticStorage()
{
for (EventType e: EventType.values())
{
storage.put(e, new ArrayList());
}
}
private void put(EventDataRow data)
{
if (data == null) return;
storage.get(data.getType()).add(data);
}
}
}


package com.javarush.task.task27.task2712.statistic.event;

public enum EventType {
COOKED_ORDER,
SELECTED_VIDEOS,
NO_AVAILABLE_VIDEO
}

package com.javarush.task.task27.task2712.statistic.event;

public interface EventDataRow {
EventType getType();
}


package com.javarush.task.task27.task2712.statistic.event;

import com.javarush.task.task27.task2712.kitchen.Dish;
import java.util.Date;
import java.util.List;

public class CookedOrderEventDataRow implements EventDataRow {
private String tabletName; //имя планшета
private String cookName; //имя повара
private int cookingTimeSeconds; //время приготовления заказа в секундах
private ListcookingDishs; //список блюд для приготовления
private Date currentDate; //текущая дата

public CookedOrderEventDataRow(String tabletName, String cookName, int cookingTimeSeconds, ListcookingDishs) {
this.tabletName = tabletName;
this.cookName = cookName;
this.cookingTimeSeconds = cookingTimeSeconds;
this.cookingDishs = cookingDishs;
this.currentDate = new Date();
}

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


package com.javarush.task.task27.task2712.statistic.event;

import com.javarush.task.task27.task2712.ad.Advertisement;
import java.util.Date;
import java.util.List;

public class VideoSelectedEventDataRow implements EventDataRow {
private ListoptimalVideoSet; //список видео-роликов, отобранных для показа
private long amount; //сумма денег в копейках
private int totalDuration; //общая продолжительность показа отобранных рекламных роликов
private Date currentDate; //текущая дата

public VideoSelectedEventDataRow(ListoptimalVideoSet, 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;
}
}


package com.javarush.task.task27.task2712.statistic.event;

import java.util.Date;

public class NoAvailableVideoEventDataRow implements EventDataRow {
private int totalDuration; //время приготовления заказа в секундах
private Date currentDate; //текущая дата

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

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


package com.javarush.task.task27.task2712.kitchen;

import com.javarush.task.task27.task2712.ConsoleHelper;
import com.javarush.task.task27.task2712.statistic.StatisticManager;
import com.javarush.task.task27.task2712.statistic.event.CookedOrderEventDataRow;
import java.util.Observable;
import java.util.Observer;

public class Cook extends Observable implements Observer {
private String name;

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

@Override
public String toString() {
return 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.getTablet().toString(), name, order.getTotalCookingTime()*60, order.getDishes()));
setChanged();
notifyObservers(arg);
}
}


package com.javarush.task.task27.task2712.ad;

import com.javarush.task.task27.task2712.ConsoleHelper;
import com.javarush.task.task27.task2712.statistic.StatisticManager;
import com.javarush.task.task27.task2712.statistic.event.VideoSelectedEventDataRow;

import java.util.*;

public class AdvertisementManager {
private final AdvertisementStorage storage = AdvertisementStorage.getInstance();
private int timeSeconds;

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

public void processVideos() throws NoVideoAvailableException {
if (storage.list().isEmpty()){
throw new NoVideoAvailableException();}
else {
Setset = new HashSet<>(storage.list());
Set<Set> res;
res = powerSet(set);
List<Set> list = new ArrayList<>(res);
List<Set> otborPoVrem = new ArrayList<>();
for (Sets: list) {
if (!s.isEmpty()) {
int time = 0;
for (Advertisement a: s) {
if (a.getHits() != 0)
time += a.getDuration();
else s.remove(a);
}
if (time <= timeSeconds) {
otborPoVrem.add(s);
}
}
}
Collections.sort(otborPoVrem, new Comparator<Set>() {
@Override
public int compare(Seto1, Seto2) {
long s1 = 0, s2 = 0;
int time1 = 0, time2 = 0;
for (Advertisement a1: o1) {
s1 += a1.getAmountPerOneDisplaying();
time1 += a1.getDuration();
}
for (Advertisement a2: o2) {
s2 += a2.getAmountPerOneDisplaying();
time2 += a2.getDuration();
}
if (s1 != s2) {
return s1 > s2? 1: -1;
} else if (time1 != time2) {
return time1 > time2? 1: -1;
} else {
return o2.size() > o1.size()? 1: -1;
}
}
});

Listad = new ArrayList<>(otborPoVrem.get(otborPoVrem.size() — 1));

Collections.sort(ad, new Comparator() {
@Override
public int compare(Advertisement o1, Advertisement o2) {
if (o2.getAmountPerOneDisplaying() — o1.getAmountPerOneDisplaying() != 0)
return (int) (o2.getAmountPerOneDisplaying() — o1.getAmountPerOneDisplaying());
else
return (int) (1000 * o1.getAmountPerOneDisplaying() / o1.getDuration() — 1000 * o2.getAmountPerOneDisplaying() / o2.getDuration());

}
});

long summa = 0;
int prodolz = 0;
for (Advertisement a: ad){
summa += a.getAmountPerOneDisplaying();
prodolz += a.getDuration();
}

StatisticManager.getInstance().register(new VideoSelectedEventDataRow(ad, summa, prodolz));

for (Advertisement a: ad) {
ConsoleHelper.writeMessage(a.getName() + " is displaying… " + a.getAmountPerOneDisplaying() +
", " + 1000 * a.getAmountPerOneDisplaying() / a.getDuration());
a.revalidate();
}
}
}
public static Set<Set> powerSet (Set originalSet) {
Set<Set> sets = new HashSet<Set>();
if (originalSet.isEmpty()) {
sets.add(new HashSet());
return sets;
}
Listlist = new ArrayList(originalSet);
T head = list.get(0);
Setrest = new HashSet(list.subList(1, list.size()));
for (Setset: powerSet(rest)) {
SetnewSet = new HashSet();
newSet.add(head);
newSet.addAll(set);
sets.add(newSet);
sets.add(set);
}
return sets;
}
}


package com.javarush.task.task27.task2712;

import com.javarush.task.task27.task2712.ad.AdvertisementManager;
import com.javarush.task.task27.task2712.ad.NoVideoAvailableException;
import com.javarush.task.task27.task2712.kitchen.Order;
import com.javarush.task.task27.task2712.statistic.StatisticManager;
import com.javarush.task.task27.task2712.statistic.event.NoAvailableVideoEventDataRow;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Observable;

public class Tablet extends Observable {
final int number;
static Logger logger = Logger.getLogger(Tablet.class.getName());

public Tablet(int number) {
this.number = number;
}

public Order createOrder(){
try {
Order order = new Order(this);
ConsoleHelper.writeMessage(order.toString());
if (!order.isEmpty()){
setChanged();
notifyObservers(order);}
try {
new AdvertisementManager(order.getTotalCookingTime()*60).processVideos();
} catch (NoVideoAvailableException e) {
StatisticManager.getInstance().register(new NoAvailableVideoEventDataRow(order.getTotalCookingTime()*60));
logger.log(Level.INFO, «No video is available for the order » + order);
}
return order;
} catch (IOException e) {
logger.log(Level.SEVERE, «Console is unavailable.»);
return null;
}

}

public int getNumber() {
return number;
}

@Override
public String toString() {
return «Tablet{» +
«number=» + number +
'}';
}
}
  • ,

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