/** * Gets recommendations for the currently logged in user. * * @return An array containing the recommendations */ public Medium[] getRecommendedMedia() { User u = Database.getInstance().getLoggedInUser(); if (u == null) return null; LinkedList<Medium> recommendedMedia = new LinkedList<>(); // Get favorite genre HashMap<Genre, Integer> mediumCounts = new HashMap<>(); Integer count; int maxCount = -1; Genre favoriteGenre = null; for (Medium m : u.getFavoriteMediums()) { count = mediumCounts.get(m.getGenre()); if (count == null) { count = 1; } else { count++; } mediumCounts.put(m.getGenre(), count); if (count > maxCount) { maxCount = count; favoriteGenre = m.getGenre(); } } // Use topgenre if no favorite genre was found if (favoriteGenre == null) { favoriteGenre = Database.getInstance().getTopGenre(); } // Get a song out of the favorite genre that is not rated yet for (Medium m : favoriteGenre.getMedia()) { if (m.getRatingList().get(u.hashCode()) == null) { recommendedMedia.add(m); } } // Return random top 10 Collections.shuffle(recommendedMedia); recommendedMedia = new LinkedList(recommendedMedia.subList(0, Math.min(recommendedMedia.size(), 10))); Medium[] result = new Medium[recommendedMedia.size()]; recommendedMedia.toArray(result); return result; }