答案:设计user、movie、rating类并用map和list存储数据,通过统计用户评分偏好类型实现基于内容的推荐,结合控制台交互功能提供个性化电影推荐。

开发一个简易的电影评分与推荐系统,可以使用Java结合基础的数据结构和简单的推荐算法来实现。重点在于管理用户、电影、评分数据,并基于用户行为提供个性化推荐。以下是具体实现思路和步骤。
1. 设计核心类与数据结构
系统需要几个核心类来表示实体和关系:
- User:包含用户ID和名称
- Movie:包含电影ID、名称和类型(如动作、喜剧)
- Rating:记录用户对电影的评分(如1-5分)
- RecommendationSystem:主逻辑类,负责存储数据并生成推荐
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;
}
}
2. 存储与管理数据
使用Map和List来保存用户、电影和评分数据,便于快速查找和操作。
- 用
Map<integer user></integer>按ID存储用户 - 用
Map<integer movie></integer>存储电影 - 用
List<rating></rating>或Map<string integer></string>(组合键)存评分
初始化一些测试数据,方便后续计算推荐。
立即学习“Java免费学习笔记(深入)”;
3. 实现简单推荐逻辑
可以采用“基于内容的推荐”或“协同过滤”的简化版本。
基于类型偏好推荐:- 统计用户评过分的电影类型
- 找出用户偏好的类型(平均分高的)
- 推荐该类型中尚未看过的高分电影
public List<Movie> recommendByGenre(int userId) {
// 获取用户所有评分
List<Rating> userRatings = ratings.stream()
.filter(r -> r.userId == userId)
.toList();
// 计算用户对各类型的平均分
Map<String, Double> genreScores = new HashMap<>();
Map<String, Integer> 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 favoriteGenre = 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();
}
4. 添加交互功能
通过控制台输入输出,让用户添加评分、查看推荐。
- 使用
Scanner读取用户输入 - 提供菜单:查看推荐、评分电影、退出
例如:
System.out.println("1. 评分电影 2. 查看推荐 3. 退出");
int choice = scanner.nextInt();
根据选择调用对应方法。
基本上就这些。这个系统虽简单,但涵盖了推荐系统的基本要素:数据建模、用户行为分析和推荐生成。后续可扩展为Web应用,加入更多算法如余弦相似度或用户协同过滤。










