java实现连续登录七天功能,并返回当前登录天数及标识
时间: 2023-07-30 19:04:14 浏览: 135
可以使用一个Map来存储每个用户的登录情况,key为用户id,value为一个长度为7的boolean数组,表示该用户连续登录的情况。
具体实现如下:
```java
import java.util.HashMap;
import java.util.Map;
public class LoginSystem {
private Map<String, boolean[]> loginMap; // 用于存储登录信息
public LoginSystem() {
loginMap = new HashMap<>();
}
// 用户登录,传入用户id和当前日期(格式为yyyyMMdd)
public LoginResult login(String userId, String date) {
boolean[] loginStatus = loginMap.get(userId);
if (loginStatus == null) { // 如果该用户没有登录过,初始化为全false
loginStatus = new boolean[7];
loginMap.put(userId, loginStatus);
}
// 判断是否连续登录
int index = getIndex(date);
if (loginStatus[index]) { // 已经登录过了
return new LoginResult(false, getConsecutiveDays(loginStatus), loginStatus);
} else { // 第一次登录或者不连续登录
loginStatus[index] = true;
int consecutiveDays = getConsecutiveDays(loginStatus);
return new LoginResult(true, consecutiveDays, loginStatus);
}
}
// 获取日期在一周中的位置,0表示最近一天,6表示最久一天
private int getIndex(String date) {
long days = (Long.parseLong(date) - Long.parseLong("20200101")) / 1000 / 60 / 60 / 24;
return (int) (6 - days % 7);
}
// 获取连续登录天数
private int getConsecutiveDays(boolean[] loginStatus) {
int consecutiveDays = 0;
for (int i = 0; i < 7; i++) {
if (loginStatus[i]) {
consecutiveDays++;
} else {
break;
}
}
return consecutiveDays;
}
// 登录结果类
public static class LoginResult {
private boolean success; // 登录是否成功
private int consecutiveDays; // 连续登录天数
private boolean[] loginStatus; // 登录情况
public LoginResult(boolean success, int consecutiveDays, boolean[] loginStatus) {
this.success = success;
this.consecutiveDays = consecutiveDays;
this.loginStatus = loginStatus;
}
public boolean isSuccess() {
return success;
}
public int getConsecutiveDays() {
return consecutiveDays;
}
public boolean[] getLoginStatus() {
return loginStatus;
}
}
}
```
使用方法:
```java
public static void main(String[] args) {
LoginSystem loginSystem = new LoginSystem();
LoginSystem.LoginResult result1 = loginSystem.login("user1", "20210719");
System.out.println(result1.isSuccess()); // true
System.out.println(result1.getConsecutiveDays()); // 1
System.out.println(Arrays.toString(result1.getLoginStatus())); // [false, false, false, false, false, false, true]
LoginSystem.LoginResult result2 = loginSystem.login("user1", "20210720");
System.out.println(result2.isSuccess()); // true
System.out.println(result2.getConsecutiveDays()); // 2
System.out.println(Arrays.toString(result2.getLoginStatus())); // [false, false, false, false, false, true, true]
LoginSystem.LoginResult result3 = loginSystem.login("user1", "20210722");
System.out.println(result3.isSuccess()); // false
System.out.println(result3.getConsecutiveDays()); // 2
System.out.println(Arrays.toString(result3.getLoginStatus())); // [false, false, false, false, false, true, true]
}
```
注意,上面的实现中日期的格式为yyyyMMdd,如果需要其他格式的日期,需要修改`getIndex()`方法。同时,该实现没有考虑多线程的情况,如果需要在多线程环境下使用,需要加锁。
阅读全文