Advertisement
dzocesrce

[NP] Streaming Platform

Apr 13th, 2025 (edited)
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.44 KB | None | 0 0
  1. import java.io.OutputStream;
  2. import java.io.PrintWriter;
  3. import java.util.*;
  4. import java.util.stream.Collectors;
  5. import java.util.List;
  6. import java.io.PrintStream;
  7. import java.io.PrintWriter;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.List;
  11. import java.util.stream.Collectors;
  12. import java.util.ArrayList;
  13. import java.util.Comparator;
  14. import java.util.List;
  15.  
  16. class TVShow extends Show{
  17.  
  18.     List<List<Integer>> episodes;
  19.     List<Double> episode_ratings;
  20.  
  21.     public TVShow(String name, List<String> genres,List<List<Integer>> episodes) {
  22.         super(name, genres);
  23.         this.episodes= episodes;
  24.         this.episode_ratings= new ArrayList<>();
  25.         calculateRating(episodes);
  26.     }
  27.  
  28.     public void calculateRating(List<List<Integer>> episodes) {
  29.         for(List<Integer> episode : episodes){
  30.             episode_ratings.add(((double)episode.stream().mapToInt(i->i).sum()/episode.stream().count())
  31.                     *Math.min(episode.size()/20.0,1.00));
  32.  
  33.         }
  34.  
  35.     }
  36.  
  37.     @Override
  38.     public double averageRating() {
  39.         return (episode_ratings.stream().sorted(Comparator.reverseOrder()).limit(3).mapToDouble(i->i).sum())/3.00;
  40.     }
  41.  
  42.  
  43.     @Override
  44.     public ShowType getShowType() {
  45.         return ShowType.TV_Show;
  46.     }
  47.  
  48.     @Override
  49.     public String getNumberOfEpisodes() {
  50.         return String.format("(%d episodes)",this.episodes.size());
  51.     }
  52.  
  53.  
  54.     @Override
  55.     public int compareTo(Show other) {
  56.         return Double.compare(this.averageRating(),other.averageRating());
  57.     }
  58. }
  59.  
  60. enum ShowType {
  61.     Movie,
  62.     TV_Show
  63. }
  64.  
  65. abstract class Show implements Comparable<Show> {
  66.     private String name;
  67.     private List<String> genres;
  68.  
  69.     public Show(String name,List<String> genres) {
  70.         this.name = name;
  71.         this.genres= genres;
  72.     }
  73.    
  74.         public List<String> getGenres() {
  75.         return genres;
  76.     }
  77.  
  78.     public abstract double averageRating();
  79.  
  80.     public abstract ShowType getShowType();
  81.  
  82.     public abstract String getNumberOfEpisodes();
  83.  
  84.  
  85.     @Override
  86.     public String toString() {
  87.  
  88.  
  89.         return String.format("%s %s %.4f %s",getShowType().name().replace("_"," "),name,averageRating(),getNumberOfEpisodes());
  90.  
  91.     }
  92. }
  93.  
  94.  
  95. class StreamingPlatform {
  96.     private List<Show> shows;
  97.  
  98.     public StreamingPlatform() {
  99.         this.shows = new ArrayList<>();
  100.     }
  101.  
  102.     public void addItem(String data) {
  103.     String[] parts = data.split(";");
  104.     String name= parts[0];
  105.     List<String> genres = Arrays.stream(parts[1].split(",")).collect(Collectors.toList());
  106.     List<Integer> ratings = new ArrayList<>();
  107.     List<List<Integer>> episodes = new ArrayList<>();
  108.         if(parts.length<4){
  109.             ratings = Arrays.stream(parts[2].split("\\s+"))
  110.                     .map(i-> Integer.parseInt(i)).collect(Collectors.toList());
  111.             this.shows.add(new Movie(name,genres,ratings));
  112.         }
  113.  
  114.         else{
  115.             for(int i=2;i<parts.length;i++){
  116.                 ratings = Arrays.stream(parts[i].split("\\s+")).skip(1)
  117.                         .map(rating-> Integer.parseInt(rating)).collect(Collectors.toList());
  118.                 episodes.add(ratings);
  119.             }
  120.             this.shows.add(new TVShow(name,genres,episodes));
  121.     }
  122.  
  123.  
  124.     }
  125.  
  126.     public void listAllItems(PrintStream out) {
  127.         PrintWriter printWriter = new PrintWriter(out);
  128.  
  129.         shows.stream().sorted(Comparator.reverseOrder()).forEach(i->printWriter.println(i));
  130.  
  131.         printWriter.flush();
  132.     }
  133.  
  134.     public void listFromGenre(String genre, PrintStream out) {
  135.  
  136.         PrintWriter printWriter = new PrintWriter(out);
  137.  
  138.         shows.stream().filter(i-> i.getGenres().contains(genre))
  139.                 .sorted(Comparator.reverseOrder())
  140.                 .forEach(i->printWriter.println(i));
  141.  
  142.         printWriter.flush();
  143.     }
  144. }
  145.  
  146. class Movie extends Show{
  147.  
  148.     private List<Integer> ratings;
  149.     private ShowType showType;
  150.     public Movie(String name, List<String> genres, List<Integer> ratings) {
  151.         super(name, genres);
  152.         this.ratings= ratings;
  153.         this.showType= ShowType.Movie;
  154.     }
  155.  
  156.  
  157.     @Override
  158.     public double averageRating() {
  159.         return ((double)ratings.stream().mapToInt(i->i).sum()/ratings.stream().count())*Math.min(ratings.size()/20.0,1.00) ;
  160.  
  161.     }
  162.  
  163.     @Override
  164.     public ShowType getShowType() {
  165.         return ShowType.Movie;
  166.     }
  167.  
  168.     @Override
  169.     public String getNumberOfEpisodes() {
  170.         return "";
  171.     }
  172.  
  173.     @Override
  174.     public int compareTo(Show other) {
  175.         return Double.compare(this.averageRating(),other.averageRating());
  176.     }
  177.  
  178. }
  179.  
  180.  
  181. public class StreamingPlatformTest {
  182.     public static void main(String[] args) {
  183.         Scanner sc = new Scanner(System.in);
  184.         StreamingPlatform sp = new StreamingPlatform();
  185.         while (sc.hasNextLine()){
  186.             String line = sc.nextLine();
  187.             String [] parts = line.split(" ");
  188.             String method = parts[0];
  189.             String data = Arrays.stream(parts).skip(1).collect(Collectors.joining(" "));
  190.             if (method.equals("addItem")){
  191.                 sp.addItem(data);
  192.             }
  193.             else if (method.equals("listAllItems")){
  194.                 sp.listAllItems(System.out);
  195.             } else if (method.equals("listFromGenre")){
  196.                 System.out.println(data);
  197.                 sp.listFromGenre(data, System.out);
  198.             }
  199.         }
  200.  
  201.     }
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement