答案:设计User、Movie、Rating类并用Map和List存储数据,通过统计用户评分偏好类型实现基于内容的推荐,结合控制台交互功能提供个性化电影推荐。
开发一个简易的电影评分与推荐系统,可以使用Java结合基础的数据结构和简单的推荐算法来实现。重点在于管理用户、电影、评分数据,并基于用户行为提供个性化推荐。以下是具体实现思路和步骤。
系统需要几个核心类来表示实体和关系:
class User {
int userId;
String name;
public User(int userId, String name) {
this.userId = userId;
this.name = name;
}
}
class Movie {
int movieId;
String title;
String genre;
public Movie(int movieId, String title, String genre) {
this.movieId = movieId;
this.title = title;
this.genre = genre;
}
}
class Rating {
int userId;
int movieId;
int score; // 1-5
public Rating(int userId, int movieId, int score) {
this.userId = userId;
this.movieId = movieId;
this.score = score;
}
}
使用Map和List来保存用户、电影和评分数据,便于快速查找和操作。
Map按ID存储用户Map存储电影List或Map(组合键)存评分初始化一些测试数据,方便后续计算推荐。
可以采用“基于内容的推荐”或“协同过滤”的简化版本。
基于类型偏好推荐:public ListrecommendByGenre(int userId) { // 获取用户所有评分 List userRatings = ratings.stream() .filter(r -> r.userId == userId) .toList(); // 计算用户对各类型的平均分 Map genreScores = new HashMap<>(); Map genreCount = new HashMap<>(); for (Rating r : userRatings) { Movie m = movies.get(r.movieId); if (m != null) { genreScores.put(m.genre, genreScores.getOrDefault(m.genre, 0.0) + r.score); genreCount.put(m.genre, genreCount.getOrDefault(m.genre, 0) + 1); } } // 找出用户最喜欢的类型 String fav oriteGenre = null; double maxAvg = 0; for (String genre : genreScores.keySet()) { double avg = genreScores.get(genre) / genreCount.get(genre); if (avg > maxAvg) { maxAvg = avg; favoriteGenre = genre; } } // 推荐该类型中未评分的高分电影 return movies.values().stream() .filter(m -> m.genre.equals(favoriteGenre)) .filter(m -> userRatings.stream().noneMatch(r -> r.movieId == m.movieId)) .sorted((a, b) -> Double.compare(getAverageRating(b.movieId), getAverageRating(a.movieId))) .limit(5) .toList(); }
通过控制台输入输出,让用户添加评分、查看推荐。
Scanner读取用户输入例如:
System.out.println("1. 评分电影 2. 查看推荐 3. 退出");
int choice = scanner.nextInt();
根据选择调用对应方法。
基本上就这些。这个系统虽简单,但涵盖了推荐系统的基本要素:数据建模、用户行为分析和推荐生成。后续可扩展为Web应用,加入更多算法如余弦相似度或用户协同过滤。