Advertisement
Guest User

BadCode.Java

a guest
May 23rd, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.11 KB | None | 0 0
  1. package movie;
  2.  
  3. import Database.SparqlQueries;
  4. import Database.User;
  5. import org.apache.commons.lang3.math.NumberUtils;
  6. import org.apache.jena.query.ResultSet;
  7.  
  8. import java.util.*;
  9. import java.util.stream.IntStream;
  10.  
  11. public class MovieRecommender {
  12.  
  13.     public MovieRecommender() {}
  14.  
  15.     public static final HashMap<String, Movie> movieMap = new HashMap<>();
  16.  
  17.     public static void main(String[] args) {
  18.  
  19.         MovieMap.initMovieMap(movieMap);
  20.  
  21.         List<Movie> testMovies = new ArrayList<>();
  22.         testMovies.add(movieMap.get("Avatar"));
  23.         testMovies.add(movieMap.get("The Following"));
  24.         testMovies.add(movieMap.get("Shanghai Calling"));
  25.         testMovies.add(movieMap.get("Skyfall"));
  26.         testMovies.add(movieMap.get("Tangled"));        
  27.  
  28.         List<String> testGenres = new ArrayList<>();
  29.         testGenres.add("Comedy");
  30.         testGenres.add("Drama");
  31.         testGenres.add("Action");
  32.  
  33.         recommend(new User(testMovies, testGenres));
  34.     }
  35.  
  36.     public static Map<Movie, Integer> scoreMap = new HashMap<>();
  37.     private static List<Movie> usedMovies = new ArrayList<>();
  38.     private static List<Movie> recommendedMovies = new ArrayList<>();
  39.  
  40.     private static int count = 0;
  41.  
  42.     private static SparqlQueries sparqlQueries = new SparqlQueries();
  43.  
  44.     public static void recommend(User user) {
  45.         count++;
  46.  
  47.         if (count <= 1) {
  48.             Movie selectedMovie = selectMovie(user, usedMovies);
  49.             System.out.println(selectedMovie.getTitle());
  50.  
  51.             ResultSet allMovies = sparqlQueries.allTitles();
  52.  
  53.             allMovies.forEachRemaining(
  54.  
  55.                 querySolution -> {
  56.  
  57.                     if (querySolution.get("?title").toString() != null) {
  58.  
  59.                         int score = 0;
  60.  
  61.                         Movie targetMovie = movieMap.get(querySolution.get("?title").toString());
  62.  
  63.                         if (!user.getMovies().contains(targetMovie)) {
  64.  
  65.                             if (targetMovie.getTitle().contains(selectedMovie.getTitle())) {
  66.                                 score += 20;
  67.                             }
  68.  
  69.                             score += IntStream.range(0, targetMovie.getActors().size()).filter(i -> targetMovie.getActors().get(i).contains(selectedMovie.getActors().toString())).map(i -> 10).sum();
  70.  
  71.                             String genre = targetMovie.getGenres();
  72.                             String[] genres = genre.split("\\|");
  73.                             for (String s : genres) {
  74.                                 if (user.getGenres().contains(s)) {
  75.                                     score += 5;
  76.                                 }
  77.                             }
  78.  
  79.                             if (withinYear(3, selectedMovie, targetMovie)) {
  80.                                 score += 3;
  81.                             } else if (withinYear(5, selectedMovie, targetMovie)) {
  82.                                 score += 2;
  83.                             } else if (withinYear(10, selectedMovie, targetMovie)){
  84.                                 score += 1;
  85.                             } else {
  86.                                 score -= 3;
  87.                             }
  88.  
  89.                             if (targetMovie.getDirector().equals(selectedMovie.getDirector())) {
  90.                                 score += 5;
  91.                             }
  92.  
  93.                             if (targetMovie.getLanguage().equals(selectedMovie.getLanguage())) {
  94.                                 score += 10;
  95.                             } else {
  96.                                 score -= 5;
  97.                             }
  98.  
  99.                             if (targetMovie.getCountry().equals(selectedMovie.getCountry())) {
  100.                                 score += 5;
  101.                             } else {
  102.                                 score -= 3;
  103.                             }
  104.  
  105.                             if (Double.parseDouble(targetMovie.getScore()) >= Double.parseDouble(selectedMovie.getScore())) {
  106.                                 score += (int) Math.round(Double.parseDouble(targetMovie.getScore()) - Double.parseDouble(selectedMovie.getScore()));
  107.                             } else {
  108.                                 score -= (int) Math.round(Double.parseDouble(selectedMovie.getScore()) - Double.parseDouble(targetMovie.getScore()));
  109.                             }
  110.  
  111.                             if (!targetMovie.getRating().equalsIgnoreCase("unknown") || !targetMovie.getRating().equalsIgnoreCase("Not Rated")) {
  112.                                 if (targetMovie.getRating().equals(selectedMovie.getRating())) {
  113.                                     score += 3;
  114.                                 } else {
  115.                                     score -= 3;
  116.                                 }
  117.                             }
  118.  
  119.                             // Keywords
  120.  
  121.                             if (!Collections.disjoint(targetMovie.getKeywords(), selectedMovie.getKeywords())) {
  122.                                 score += 10;
  123.                             }
  124.  
  125.                             if (!Collections.disjoint(targetMovie.getActors(), selectedMovie.getActors())) {
  126.                                 score += 5;
  127.                             }
  128.  
  129.                             System.out.println(targetMovie.getTitle() + "\tScore: " + score);
  130.  
  131.                             System.out.println("---------------------------------");
  132.  
  133.                         }
  134.  
  135.                         scoreMap.put(targetMovie, score);
  136.  
  137.                     }
  138.                 }
  139.             );
  140.  
  141.             int biggest = 0;
  142.             Movie recommendedMovie = null;
  143.  
  144.             for (Map.Entry<Movie, Integer> entry : scoreMap.entrySet()) {
  145.                 if (entry.getValue() >= biggest) {
  146.                     biggest = entry.getValue();
  147.                     recommendedMovie = entry.getKey();
  148.                 }
  149.             }
  150.  
  151.             recommendedMovies.add(recommendedMovie);
  152.  
  153.             recommend(user);
  154.         }
  155.  
  156.     }
  157.  
  158.     private static Boolean withinYear(int year, Movie selected, Movie target) {
  159.         if (NumberUtils.isNumber(target.getYear())) {
  160.  
  161.             if (NumberUtils.isNumber(selected.getYear())) {
  162.  
  163.                 int targetYear = Integer.parseInt(target.getYear());
  164.                 int selectedYear = Integer.parseInt(selected.getYear());
  165.  
  166.                 int targetPlusMargin =  Math.addExact(targetYear, year);
  167.                 int targetMinusMargin =  Math.subtractExact(targetYear, year);
  168.  
  169.                 return selectedYear <= targetPlusMargin && selectedYear >= targetMinusMargin;
  170.             }
  171.         }
  172.         return false;
  173.     }
  174.  
  175.     private static Movie selectMovie(User user, List<Movie> usedMovies) {
  176.         Movie selectedMovie = user.getMovies().get(getRandomIntegerInRange(0, 5));
  177.  
  178.         if (usedMovies.contains(selectedMovie)) {
  179.             return selectMovie(user, usedMovies);
  180.         } else {
  181.             usedMovies.add(selectedMovie);
  182.             return selectedMovie;
  183.         }
  184.  
  185.     }
  186.  
  187.     public static int getRandomIntegerInRange(int min, int max) {
  188.         return (int) ((Math.random() * (max - min)) + min);
  189.     }
  190.  
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement