Map<String,Integer> userCountMap = new HashMap<>(); for(String userId : hasSummaryUsers){ Integer count = userCountMap.get(userId); userCountMap.put(userId,count == null ? 1 : count+1); } if(!CollectionUtils.isEmpty(assessList)){ for(Assess assess : assessList){ Integer count = userCountMap.get(assess.getUserId()); //缺少一周周报扣5分 if(count == null){ assess.setWeeklyPoints(weekNum*5); }else{ int points = (weekNum-count)*5; if(points < 0){ points = 0; } assess.setWeeklyPoints(points); } } 如何优化这段代码 }
时间: 2024-02-10 16:05:34 浏览: 31
可以考虑将第一个for循环改为使用Java 8的Stream API来实现统计用户数量的操作,可以更加简洁和高效:
```
Map<String,Integer> userCountMap = hasSummaryUsers.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(e -> 1)));
```
另外,在第二个for循环中可以使用Java 8的Optional类来简化代码,避免使用null判断:
```
if(!CollectionUtils.isEmpty(assessList)){
assessList.forEach(assess -> {
Integer count = Optional.ofNullable(userCountMap.get(assess.getUserId())).orElse(0);
int points = (weekNum - count) * 5;
assess.setWeeklyPoints(points < 0 ? 0 : points);
});
}
```
这样可以使代码更加简洁和易于理解。
相关问题
java代码实现一个推荐项目的功能,属于协同过滤算法按照项目类型进行推荐
好的,关于您的问题,我可以为您提供以下 Java 代码实现一个推荐项目的功能的基本思路:
1.准备好项目数据集(包含项目ID、类型、特征等信息)和用户评分数据集(包含用户ID、项目ID、评分等信息)。
2.读入数据集并进行预处理,如去重、去除缺失值等。
3.根据数据集生成用户-项目的评分矩阵,其中每个元素表示一个用户对一个项目的评分情况。
4.计算用户之间的相似度,常用的相似度度量方法有:余弦相似度、欧几里得距离、皮尔逊系数等。
5.基于相似度计算出每个用户的 Top-N 最相似用户集合。
6.根据评分矩阵和相似度计算出用户对每个没有评分过的项目的评分预测值。
7.根据评分预测值为每个用户生成推荐项目列表,推荐的项目类型与用户历史评分过的项目类型相似。
以下是一个简单实现的例子:
import java.util.*;
public class Recommender {
// 假设项目数据集和用户评分数据集已经准备好了
Map<String, List<String>> projectDataset = ...;
Map<String, List<Integer>> ratingDataset = ...;
// 用户-项目的评分矩阵
Map<String, Map<String, Integer>> ratingMatrix = new HashMap<>();
public Recommender() {
// 生成评分矩阵
for (String userId : ratingDataset.keySet()) {
List<String> itemIds = projectDataset.get(ratingDataset.get(userId));
Map<String, Integer> ratings = new HashMap<>();
for (int i = 0; i < itemIds.size(); i++) {
ratings.put(itemIds.get(i), ratingDataset.get(userId).get(i));
}
ratingMatrix.put(userId, ratings);
}
}
// 计算用户之间的相似度
public double similarity(String userId1, String userId2) {
Map<String, Integer> ratings1 = ratingMatrix.get(userId1);
Map<String, Integer> ratings2 = ratingMatrix.get(userId2);
Set<String> commonItemIds = new HashSet<>(ratings1.keySet());
commonItemIds.retainAll(ratings2.keySet());
if (commonItemIds.size() == 0) {
return 0.0;
}
double sum1 = 0.0, sum2 = 0.0, sum3 = 0.0;
for (String itemId : commonItemIds) {
int rating1 = ratings1.get(itemId);
int rating2 = ratings2.get(itemId);
sum1 += rating1 * rating1;
sum2 += rating2 * rating2;
sum3 += rating1 * rating2;
}
double similarity = sum3 / Math.sqrt(sum1 * sum2);
return similarity;
}
// 获取某个用户的 Top-N 最相似用户集合
public List<String> mostSimilarUsers(String userId, int n) {
Map<String, Double> similarityScore = new HashMap<>();
for (String otherUserId : ratingMatrix.keySet()) {
if (!otherUserId.equals(userId)) {
double similarity = similarity(userId, otherUserId);
similarityScore.put(otherUserId, similarity);
}
}
List<String> mostSimilarUsers = new ArrayList<>(similarityScore.keySet());
Collections.sort(mostSimilarUsers, new Comparator<String>() {
@Override
public int compare(String userId1, String userId2) {
double score1 = similarityScore.get(userId1);
double score2 = similarityScore.get(userId2);
return Double.compare(score2, score1);
}
});
if (mostSimilarUsers.size() > n) {
mostSimilarUsers = mostSimilarUsers.subList(0, n);
}
return mostSimilarUsers;
}
// 根据评分矩阵和相似度计算出用户对每个没有评分过的项目的评分预测值
public int predictRating(String userId, String itemId, List<String> similarUsers) {
double sum1 = 0.0, sum2 = 0.0;
for (String otherUserId : similarUsers) {
Map<String, Integer> ratings = ratingMatrix.get(otherUserId);
if (ratings.containsKey(itemId)) {
double similarity = similarity(userId, otherUserId);
int rating = ratings.get(itemId);
sum1 += similarity * rating;
sum2 += similarity;
}
}
int predictedRating = (int)Math.round(sum1 / sum2);
return predictedRating;
}
// 根据评分预测值为每个用户生成推荐项目列表,推荐的项目类型与用户历史评分过的项目类型相似
public List<String> recommendProjects(String userId, int n) {
Set<String> ratedItemIds = ratingMatrix.get(userId).keySet();
Set<String> allItemIds = new HashSet<>();
for (List<String> itemIds : projectDataset.values()) {
allItemIds.addAll(itemIds);
}
allItemIds.removeAll(ratedItemIds);
List<String> recommendItemIds = new ArrayList<>();
for (String itemId : allItemIds) {
int predictedRating = predictRating(userId, itemId, mostSimilarUsers(userId, 10));
if (predictedRating >= 3) { // 推荐评分大于等于3的项目
List<String> itemTypes = projectDataset.get(itemId);
List<String> ratedItemTypes = new ArrayList<>();
for (String ratedItemId : ratedItemIds) {
ratedItemTypes.addAll(projectDataset.get(ratedItemId));
}
int count = 0;
for (String type : itemTypes) {
if (ratedItemTypes.contains(type)) {
count++;
}
}
if (count > 0) { // 推荐类型与用户历史评分过的类型相似
recommendItemIds.add(itemId);
}
}
}
if (recommendItemIds.size() > n) {
recommendItemIds = recommendItemIds.subList(0, n);
}
return recommendItemIds;
}
public static void main(String[] args) {
Recommender recommender = new Recommender();
List<String> projects = recommender.recommendProjects("user1", 5);
System.out.println(projects);
}
}
上面的代码实现了基于协同过滤算法和项目类型相似度的推荐功能,您可以根据实际情况进行修改和优化,希望对您有所帮助。
spring-redis实现的Redis分布式锁的例子
以下是使用Spring Redis实现Redis分布式锁的例子:
首先,在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
```
然后,创建一个Redis分布式锁的接口:
```java
public interface RedisLock {
/**
* 获取锁
*
* @param key 锁的key
* @param expireTime 锁的过期时间
* @return 是否获取成功
*/
boolean lock(String key, long expireTime);
/**
* 释放锁
*
* @param key 锁的key
*/
void unlock(String key);
}
```
接着,实现Redis分布式锁的接口:
```java
@Component
public class RedisLockImpl implements RedisLock {
private final RedisTemplate<String, String> redisTemplate;
private final ThreadLocal<Map<String, Integer>> lockers = new ThreadLocal<>();
@Autowired
public RedisLockImpl(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public boolean lock(String key, long expireTime) {
Map<String, Integer> localLockers = getLocalLockers();
Integer count = localLockers.get(key);
if (count != null) {
localLockers.put(key, count + 1);
return true;
}
Boolean result = redisTemplate.opsForValue().setIfAbsent(key, "");
if (!result) {
return false;
}
redisTemplate.expire(key, expireTime, TimeUnit.MILLISECONDS);
localLockers.put(key, 1);
return true;
}
@Override
public void unlock(String key) {
Map<String, Integer> localLockers = getLocalLockers();
Integer count = localLockers.get(key);
if (count == null) {
return;
}
if (count > 1) {
localLockers.put(key, count - 1);
} else {
localLockers.remove(key);
redisTemplate.delete(key);
}
}
private Map<String, Integer> getLocalLockers() {
Map<String, Integer> localLockers = lockers.get();
if (localLockers != null) {
return localLockers;
}
lockers.set(new HashMap<>());
return lockers.get();
}
}
```
最后,在需要使用分布式锁的地方,注入RedisLock接口,使用lock()方法获取锁,使用unlock()方法释放锁:
```java
@Service
public class UserService {
private final RedisLock redisLock;
@Autowired
public UserService(RedisLock redisLock) {
this.redisLock = redisLock;
}
public void updateUser(String userId) {
String lockKey = "user_" + userId;
boolean locked = redisLock.lock(lockKey, 5000);
if (!locked) {
throw new RuntimeException("获取锁失败");
}
try {
// 更新用户信息
} finally {
redisLock.unlock(lockKey);
}
}
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)