Advertisement
dzocesrce

[NP] Cake Shop

Apr 12th, 2025
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.51 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.ArrayList;
  3. import java.util.Comparator;
  4. import java.util.List;
  5. import java.util.Objects;
  6. import java.util.stream.Collectors;
  7. import java.util.Arrays;
  8.  
  9. abstract class Item {
  10.     private String name;
  11.     private int price;
  12.     private ItemType itemType;
  13.  
  14.     public abstract ItemType getType();
  15.  
  16.  
  17.     public Item(String name) {
  18.         this.name = name;
  19.     }
  20.  
  21.     public String getName() {
  22.         return name;
  23.     }
  24.  
  25.     public void setName(String name) {
  26.         this.name = name;
  27.     }
  28.  
  29.     public int getPrice() {
  30.         return price;
  31.     }
  32.  
  33.     public void setPrice(int price) {
  34.         this.price = price;
  35.     }
  36.  
  37.     @Override
  38.     public String toString() {
  39.         return name + " " + price;
  40.     }
  41. }
  42.  
  43. class Cake extends Item{
  44.  
  45.     public Cake(String name) {
  46.         super(name);
  47.     }
  48.    
  49.     @Override
  50.     public ItemType getType() {
  51.         return ItemType.CAKE;
  52.     }
  53. }
  54.  
  55. class Pie extends Item{
  56.     public static int PRICE_INCREASE=50;
  57.  
  58.     @Override
  59.     public ItemType getType() {
  60.         return ItemType.PIE;
  61.     }
  62.  
  63.     public Pie(String name) {
  64.         super(name);
  65.     }
  66.  
  67.     @Override
  68.     public int getPrice(){
  69.  
  70.         return super.getPrice()+PRICE_INCREASE;
  71.     }
  72. }
  73.  
  74. enum ItemType {
  75.     CAKE,
  76.     PIE
  77. }
  78.  
  79.  
  80. class Order implements Comparable<Order> {
  81.     private long id;
  82.     private List<Item> items;
  83.  
  84.     public Order(long id) {
  85.         this.id = id;
  86.         this.items = new ArrayList<>();
  87.     }
  88.  
  89.     public Order(long id,List<Item> items) {
  90.         this.id = id;
  91.         this.items = items;
  92.     }
  93.  
  94.     public static Order createOrder(String line,int minItemsPerOrder) throws OrderNotValidException {
  95.         String[] parts = line.split("\\s+");
  96.         Long id = Long.parseLong(parts[0]);
  97.         List<Item> items = new ArrayList<>();
  98.         Arrays.stream(parts)
  99.                 .skip(1)
  100.                 .forEach(i -> {
  101.                     if(!Character.isDigit(i.charAt(0))){
  102.                         if(i.charAt(0)=='C')
  103.                             items.add(new Cake(i));
  104.                         else
  105.                             items.add(new Pie(i));
  106.                     }
  107.                     else
  108.                         items.get(items.size()-1).setPrice(Integer.parseInt(i));
  109.  
  110.                 });
  111.         if(items.size()<minItemsPerOrder)
  112.             throw new OrderNotValidException(id);
  113.  
  114.         return new Order(id,items);
  115.  
  116.     }
  117.     public int totalItems(){
  118.         return (int)items.stream().count();
  119.     }
  120.  
  121.     public int totalPriceCost(){
  122.         return items.stream().mapToInt(i -> i.getPrice()).sum();
  123.     }
  124.  
  125.     public int totalCakes(){
  126.         return (int)items.stream()
  127.                 .filter(i -> i.getType()==ItemType.CAKE)
  128.                 .count();
  129.     }
  130.  
  131.     public int totalPies(){
  132.         return (int)items.stream()
  133.                 .filter(i -> i.getType()==ItemType.PIE)
  134.                 .count();
  135.     }
  136.  
  137. //    @Override
  138. //    public String toString() {
  139. //        return String.format("%d %d",id,totalItems());
  140. //    }
  141.  
  142.     @Override
  143.     public String toString() {
  144.         return String.format("%d %d %d %d %d",id,totalItems(),totalCakes(),totalPies(),totalPriceCost());
  145.     }
  146.  
  147.     @Override
  148.     public int compareTo(Order other) {
  149.         return Integer.compare(this.totalPriceCost(),other.totalPriceCost());
  150.     }
  151.  
  152.  
  153. //    @Override
  154. //    public int compareTo(Order other) {
  155. ////        return Integer.compare(this.totalItems(),other.totalItems());
  156. //        return Comparator.comparing(Order::totalItems).compare(this,other);
  157. //    }
  158.  
  159.  
  160. }
  161.  
  162. class CakeShop {
  163.  
  164.     private int minItemsPerOrder;
  165.     private List<Order> orders;
  166.  
  167.     public CakeShop(int minItemsPerOrder) {
  168.         this.minItemsPerOrder = minItemsPerOrder;
  169.         this.orders= new ArrayList<>();
  170.     }
  171.  
  172.  
  173.     public void readCakeOrders(InputStream in) {
  174.         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
  175.         this.orders= bufferedReader.lines()
  176.                 .map(i -> {
  177.                     try {
  178.                         return Order.createOrder(i,minItemsPerOrder);
  179.                     } catch (OrderNotValidException e) {
  180.                         System.out.println(e.getMessage());
  181.                         return null;
  182.                     }
  183.                 })
  184.                 .filter(Objects::nonNull)
  185.                 .collect(Collectors.toList());
  186.  
  187.     }
  188.     public int totalNumberOfItems(){
  189.         return this.orders.stream().mapToInt(i -> i.totalItems()).sum();
  190.     }
  191.  
  192. //    public void printLongestOrder(PrintStream out) {
  193. //        PrintWriter printWriter = new PrintWriter(out);
  194. //
  195. //        orders.stream().max(Comparator.naturalOrder()).ifPresent(printWriter::println);
  196. //
  197. //        printWriter.flush();
  198. //    }
  199.  
  200.     public void printAllOrders(PrintStream out){
  201.         PrintWriter printWriter = new PrintWriter(out);
  202.  
  203.         orders.stream().sorted(Comparator.reverseOrder()).forEach(i -> printWriter.println(i));
  204.  
  205.         printWriter.flush();
  206.     }
  207. }
  208.  
  209. public class CakeShopTest {
  210.  
  211.     public static void main(String[] args) {
  212.         CakeShop cakeShop = new CakeShop(4);
  213.  
  214.         System.out.println("---READ FROM INPUT STRING---");
  215.         cakeShop.readCakeOrders(System.in);
  216.  
  217. //        System.out.println("---PRINTING LARGEST ORDER TO OUTPUT STREAM---");
  218. //        cakeShop.printLongestOrder(System.out);
  219.  
  220.         System.out.println("---PRINTING ALL ORDERS---");
  221.         cakeShop.printAllOrders(System.out);
  222.     }
  223. }
  224.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement