Advertisement
dzocesrce

[NP] Letterboxd

Apr 28th, 2025
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.13 KB | None | 0 0
  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3. import java.util.ArrayList;
  4. import java.util.Comparator;
  5. import java.util.List;
  6. class Rating {
  7.  
  8.     Movie movie;
  9.     int rating;
  10.  
  11.     public Rating( Movie movie, int rating) {
  12.  
  13.         this.movie = movie;
  14.         this.rating = rating;
  15.     }
  16.  
  17.     public Movie getMovie() {
  18.         return movie;
  19.     }
  20.  
  21.     public int getRating() {
  22.         return rating;
  23.     }
  24.  
  25.     @Override
  26.     public String toString() {
  27.         return String.format("%s",movie.toString());
  28.     }
  29. }
  30.  
  31. class User {
  32.     String id;
  33.     String username;
  34.  
  35.  
  36.     public User(String id, String username) {
  37.         this.id = id;
  38.         this.username = username;
  39.  
  40.     }
  41.  
  42.     @Override
  43.     public String toString() {
  44.         return String.format("User ID: %s Name: %s",id,username);
  45.     }
  46. }
  47.  
  48.  
  49.  
  50. class Movie implements Comparable<Movie> {
  51.     String id;
  52.     String name;
  53.     List<Integer> ratings;
  54.  
  55.     public Movie(String id, String name) {
  56.         this.id = id;
  57.         this.name = name;
  58.         this.ratings = new ArrayList<>();
  59.     }
  60.  
  61.     public double getAverageRating() {
  62.         return ratings.stream().mapToInt(i->i).average().orElse(0.0);
  63.     }
  64.  
  65.     @Override
  66.     public String toString() {
  67.         return String.format("Movie ID: %s Title: %s Rating: %.2f",id,name,getAverageRating());
  68.     }
  69.  
  70.     @Override
  71.     public int compareTo(Movie o) {
  72.         return Comparator.comparing(Movie::getAverageRating).reversed().compare(this,o);
  73.     }
  74. }
  75. class CosineSimilarityCalculator {
  76.  
  77.     public static double cosineSimilarity(Map<String, Integer> c1, Map<String, Integer> c2) {
  78.         return cosineSimilarity(c1.values(), c2.values());
  79.     }
  80.  
  81.     public static double cosineSimilarity(Collection<Integer> c1, Collection<Integer> c2) {
  82.         int[] array1;
  83.         int[] array2;
  84.         array1 = c1.stream().mapToInt(i -> i).toArray();
  85.         array2 = c2.stream().mapToInt(i -> i).toArray();
  86.         double up = 0.0;
  87.         double down1 = 0, down2 = 0;
  88.  
  89.         for (int i = 0; i < c1.size(); i++) {
  90.             up += (array1[i] * array2[i]);
  91.         }
  92.  
  93.         for (int i = 0; i < c1.size(); i++) {
  94.             down1 += (array1[i] * array1[i]);
  95.         }
  96.  
  97.         for (int i = 0; i < c1.size(); i++) {
  98.             down2 += (array2[i] * array2[i]);
  99.         }
  100.  
  101.         return up / (Math.sqrt(down1) * Math.sqrt(down2));
  102.     }
  103. }
  104.  
  105. class StreamingPlatform {
  106.  
  107.     Map<String, Movie> movies;
  108.     Map<String, User> users;
  109.     Map<String, List<Rating>> ratingsByUser;
  110.  
  111.     public StreamingPlatform() {
  112.         this.movies = new HashMap<>();
  113.         this.users = new HashMap<>();
  114.         this.ratingsByUser = new HashMap<>();
  115.     }
  116.  
  117.     public void addMovie(String id, String name) {
  118.         movies.putIfAbsent(id, new Movie(id, name));
  119.     }
  120.  
  121.     public void addUser(String id, String name) {
  122.         users.putIfAbsent(id, new User(id, name));
  123.     }
  124.  
  125.     public void addRating(String userId, String movieId, int rating) {
  126.         movies.get(movieId).ratings.add(rating);
  127.         ratingsByUser.putIfAbsent(userId, new ArrayList<>());
  128.         ratingsByUser.get(userId).add(new Rating(movies.get(movieId), rating));
  129.     }
  130.  
  131.     public void topNMovies(int n) {
  132.         movies.values().stream().sorted().limit(n).forEach(i -> System.out.println(i));
  133.     }
  134.  
  135.     public void favouriteMoviesForUsers(List<String> users) {
  136.         for (String userId : users) {
  137.             int maxRating = ratingsByUser.get(userId).stream().map(i -> i.getRating()).max(Comparator.naturalOrder()).orElse(0);
  138.             System.out.println(this.users.get(userId));
  139.             ratingsByUser.get(userId).stream().filter(i -> i.getRating() == maxRating)
  140.                     .map(i -> i.getMovie())
  141.                     .sorted()
  142.                     .forEach(i -> System.out.println(i));
  143.             System.out.println();
  144.         }
  145.  
  146.     }
  147.  
  148.     public void similarUsers(String userId) {
  149.     Map<User,Double> cosineSimularityByUser = new HashMap<>();
  150.         for (User u : users.values().stream().filter(i -> !i.id.equals(userId)).collect(Collectors.toList())) {
  151.             Map<String, Integer> mapOfRatings = new LinkedHashMap<>();
  152.             Map<String, Integer> ratingsByAnotherUser = new LinkedHashMap<>();
  153.             movies.values().stream().forEach(i -> mapOfRatings.putIfAbsent(i.id, 0));
  154.             ratingsByUser.get(userId).stream().forEach(i -> mapOfRatings.computeIfPresent(i.movie.id, (k, v) -> i.getRating()));
  155.             movies.values().stream().forEach(i -> ratingsByAnotherUser.putIfAbsent(i.id, 0));
  156.             ratingsByUser.get(u.id).stream()
  157.                     .forEach(i -> ratingsByAnotherUser.computeIfPresent(i.movie.id, (k, v) -> i.getRating()));
  158.  
  159.             cosineSimularityByUser.putIfAbsent(u,CosineSimilarityCalculator.cosineSimilarity(mapOfRatings, ratingsByAnotherUser));
  160. //            System.out.println(String.format("User ID: %s Name: %s %f",
  161. //                    u.id, u.username, CosineSimilarityCalculator.cosineSimilarity(mapOfRatings, ratingsByAnotherUser)));
  162.         }
  163.         cosineSimularityByUser.entrySet().stream().sorted(Map.Entry.<User, Double> comparingByValue(Comparator.reverseOrder()))
  164.                 .forEach(i -> System.out.println(String.format("User ID: %s Name: %s %f",
  165.                         i.getKey().id,i.getKey().username,i.getValue())));
  166.  
  167.     }
  168. }
  169. public class StreamingPlatform2 {
  170.     public static void main(String[] args) {
  171.         Scanner sc = new Scanner(System.in);
  172.  
  173.         StreamingPlatform sp = new StreamingPlatform();
  174.  
  175.         while (sc.hasNextLine()){
  176.             String line = sc.nextLine();
  177.             String [] parts = line.split("\\s+");
  178.  
  179.             if (parts[0].equals("addMovie")) {
  180.                 String id = parts[1];
  181.                 String name = Arrays.stream(parts).skip(2).collect(Collectors.joining(" "));
  182.                 sp.addMovie(id ,name);
  183.             } else if (parts[0].equals("addUser")){
  184.                 String id = parts[1];
  185.                 String name = parts[2];
  186.                 sp.addUser(id ,name);
  187.             } else if (parts[0].equals("addRating")){
  188.                 //String userId, String movieId, int rating
  189.                 String userId = parts[1];
  190.                 String movieId = parts[2];
  191.                 int rating = Integer.parseInt(parts[3]);
  192.                 sp.addRating(userId, movieId, rating);
  193.             } else if (parts[0].equals("topNMovies")){
  194.                 int n = Integer.parseInt(parts[1]);
  195.                 System.out.println("TOP " + n + " MOVIES:");
  196.                 sp.topNMovies(n);
  197.             } else if (parts[0].equals("favouriteMoviesForUsers")) {
  198.                 List<String> users = Arrays.stream(parts).skip(1).collect(Collectors.toList());
  199.                 System.out.println("FAVOURITE MOVIES FOR USERS WITH IDS: " + users.stream().collect(Collectors.joining(", ")));
  200.                 sp.favouriteMoviesForUsers(users);
  201.             } else if (parts[0].equals("similarUsers")) {
  202.                 String userId = parts[1];
  203.                 System.out.println("SIMILAR USERS TO USER WITH ID: " + userId);
  204.                 sp.similarUsers(userId);
  205.             }
  206.         }
  207.     }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement