Java-FSRS 是一个基于 Rust 版本的 FSRS (Free Spaced Repetition System) 开发的 Java 实现。该项目通过 JNI (Java Native Interface) 调用 Rust 原生库,为 Java 开发者提供了 FSRS 算法的便捷使用方式。
- 基于 Rust 版本的 FSRS 算法实现
- 通过 JNI 提供高性能的原生调用
- 支持 Java 17 及以上版本
- 提供简单易用的 API 接口
- 完整的日志支持(SLF4J + Logback)
- JDK 17 或更高版本
- Maven 3.6 或更高版本
- 支持的操作系统:Linux、macOS、Windows
- 克隆项目:
git clone https://github.com/yourusername/java-fsrs.git
cd java-fsrs
- 编译项目:
mvn clean install
import com.hedgie.framework.fsrs.FSRS;
import com.hedgie.framework.fsrs.Card;
import com.hedgie.framework.fsrs.Parameter;
import java.time.Instant;
// 创建 FSRS 实例(使用默认参数)
FSRS fsrs = new FSRS();
// 或者使用自定义参数
double[] w = {0.4, 0.6, 2.4, 5.8, 4.93, 0.94, 0.86, 0.01, 1.49, 0.14, 0.94, 2.18, 0.05, 0.34, 1.26, 0.29, 2.61};
Parameter parameter = new Parameter(
36500, // maximumInterval: 最大间隔天数
0.9, // requestRetention: 目标记忆保留率
w, // w: 算法权重参数
-0.5, // decay: 衰减因子
1.0, // factor: 难度因子
true // enableShortTerm: 是否启用短期记忆
);
FSRS fsrs = new FSRS(parameter);
// 创建卡片
Card card = new Card();
card.setStability(1.0); // 设置初始稳定性
card.setDifficulty(0.0); // 设置初始难度
card.setReps(0); // 设置复习次数
card.setLapses(0); // 设置遗忘次数
card.setElapsedDays(0); // 设置已过天数
card.setState(0); // 设置卡片状态(0: 新卡片)
card.setLastReview(Instant.now().getEpochSecond()); // 设置最后复习时间
// 执行复习
RecordLog recordLog = fsrs.repeat(card, Instant.now());
maximumInterval
: 最大间隔天数,默认 36500(约100年)requestRetention
: 目标记忆保留率,范围 0-1,默认 0.9w
: 算法权重参数数组,影响复习间隔计算decay
: 衰减因子,影响记忆强度衰减速度factor
: 难度因子,影响难度调整enableShortTerm
: 是否启用短期记忆优化
stability
: 记忆稳定性,表示记忆的牢固程度difficulty
: 记忆难度,表示内容的难易程度reps
: 复习次数lapses
: 遗忘次数elapsedDays
: 距离上次复习的天数state
: 卡片状态(0: 新卡片,1: 学习,2: 复习)lastReview
: 最后复习时间戳due
: 下次复习时间戳scheduledDays
: 计划复习天数
// 创建新卡片
Card card = new Card();
card.setStability(1.0);
card.setDifficulty(0.0);
card.setState(0);
// 第一次复习(新卡片)
RecordLog firstReview = fsrs.repeat(card, Instant.now());
System.out.println("第一次复习结果: " + firstReview);
// 更新卡片状态
card.setStability(firstReview.getStability());
card.setDifficulty(firstReview.getDifficulty());
card.setReps(card.getReps() + 1);
card.setLastReview(Instant.now().getEpochSecond());
// 等待一段时间后再次复习
// 假设过了 card.getDue() 天后
RecordLog nextReview = fsrs.repeat(card, Instant.now());
System.out.println("下次复习结果: " + nextReview);
java-fsrs/
├── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── hedgie/
│ │ └── framework/
│ │ └── fsrs/
│ │ ├── FSRS.java
│ │ ├── Card.java
│ │ ├── Parameter.java
│ │ ├── RecordLog.java
│ │ ├── ReviewLog.java
│ │ ├── SchedulingInfo.java
│ │ └── NativeLibraryLoader.java
│ └── test/
└── rust-lib/
└── src/
FSRS
: 核心类,提供 FSRS 算法的主要功能Card
: 表示学习卡片,包含卡片状态和复习信息Parameter
: 算法参数配置RecordLog
: 记录复习结果ReviewLog
: 复习日志SchedulingInfo
: 调度信息NativeLibraryLoader
: 原生库加载器
- SLF4J 2.0.4
- Logback 1.4.5
- Lombok 1.18.22
- JUnit 5.10.1 (测试)
本项目采用 MIT 许可证。详见 LICENSE 文件。
欢迎提交 Issue 和 Pull Request 来帮助改进项目。
本项目基于 Rust 版本的 FSRS 实现,感谢原作者的贡献。