Java 实现简单的根据艾斯浩宾遗忘曲线动态生成计划表

article/2025/8/30 12:48:56
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.*;public class Ebbinghaus {private static final Logger log = LoggerFactory.getLogger(Ebbinghaus.class);private List<LearnRow> schemeTable = new ArrayList<>();//生成的计划表private HashMap<Integer, LearnRow> DayToTabMap = new HashMap<>();//映射计划表中行元素信息 <天数,映射对应的计划表Row>private LinkedHashMap<Integer, Integer> learnStateMap = new LinkedHashMap<>();//学习情况表 <当日计划表中是第几天,当日学习单词量>private int sumWordSize;//总单词量private int needLearnDay;//还需要学习的天数private int learnedWordCount = 0;//学习过的单词数private int nowDay = 1;//当前天数class LearnRow {private int toLearnIndex;//需要学习哪天的单词列表的索引private List<Integer> toReviewList;public LearnRow() {}public LearnRow(int toLearnIndex, List<Integer> toReviewList) {this.toLearnIndex = toLearnIndex;this.toReviewList = toReviewList;}@Overridepublic String toString() {return "LearnRow{" +"toLearnIndex=" + toLearnIndex +", toReviewList=" + toReviewList +'}';}public int getToLearnIndex() {return toLearnIndex;}public void setToLearnIndex(int toLearnIndex) {this.toLearnIndex = toLearnIndex;}public List<Integer> getToReviewList() {return toReviewList;}public void setToReviewList(List<Integer> toReviewList) {this.toReviewList = toReviewList;}}public Ebbinghaus(int sumWordSize) {this.sumWordSize = sumWordSize;}public List<LearnRow> getSchemeTable() {return schemeTable;}public HashMap<Integer, LearnRow> getDayToTabMap() {return DayToTabMap;}public LinkedHashMap<Integer, Integer> getLearnStateMap() {return learnStateMap;}/*** 添加一条学习记录信息,会导致更新*/public void pushLearnRecord(int dayToLearnWordSize) {learnStateMap.put(new Integer(nowDay++), new Integer(dayToLearnWordSize));this.learnedWordCount += dayToLearnWordSize;if (dayToLearnWordSize != 0) {this.needLearnDay = (this.sumWordSize - this.learnedWordCount) / dayToLearnWordSize;}//更新计划表此天后的计划if (learnStateMap.size() == 1) {//说明刚插入的是第一条记录,初始化计划表log.debug("初始化计划表");if (dayToLearnWordSize == 0) {//如果第一天计划0个单词,则返回错误throw new RuntimeException("第一天计划单词数不能为0");}//循环处理生成每一天的计划 每天学习当天的list 同时还要复习 1 天前的,2天前的 4天前的 7 天前的 15 天前的单词(如果存在的话)for (int i = 1; i <= this.needLearnDay + 1 + 15; i++) {if (i == 1) {//如果为第一天,生成RowArrayList<Integer> learnIndexList = new ArrayList<Integer>();LearnRow learnRow = new LearnRow(i, learnIndexList);schemeTable.add(learnRow);DayToTabMap.put(new Integer(i), learnRow);} else {//非第一天,生成RowArrayList<Integer> learnIndexList = new ArrayList<Integer>();//遍历前面每一个计划表Row,如果存在toLearnIndex不为0 的 1 天前的,2天前的 4天前的 7 天前的 15 天前的index 则加入learnIndexListfor (int j = 1; j < i; j++) {if (DayToTabMap.get(new Integer(j)).toLearnIndex != 0 && ((i - j) == 1 || (i - j) == 2 || (i - j) == 4 || (i - j) == 7 || (i - j) == 15)) {learnIndexList.add(new Integer(j));}}LearnRow learnRow = new LearnRow(i > (this.needLearnDay + 1) ? 0 : i % (this.needLearnDay + 2), learnIndexList);schemeTable.add(learnRow);DayToTabMap.put(new Integer(i), learnRow);}}log.debug(schemeTable.toString());} else {//新增的记录,判断学习单词数是否与前面一个的相同(前一天为nowDay - 2),如果不同则修改插入的该天后面的计划表 否则不变if (dayToLearnWordSize != learnStateMap.get(new Integer(nowDay - 2)).intValue()) {log.debug("需要重构表");//移除后面的表Row,重新插入新的重建Rowint size = schemeTable.size();for (int i = (this.nowDay - 1); i <= size; i++) {schemeTable.remove(this.nowDay - 2);}for (int i = (this.nowDay - 1); i <= size; i++) {DayToTabMap.remove(new Integer(i));}//重建删除项if (dayToLearnWordSize == 0) {//当插入一条学习计划为0的时候,重建删除项//需要先添加一条空的,再重建后续for (int i = this.nowDay - 1; i < this.needLearnDay + this.nowDay + 15; i++) {//处理重建数据的第一条数据,也就是当天的if (i == (this.nowDay - 1)) {ArrayList<Integer> learnIndexList = new ArrayList<Integer>();LearnRow learnRow = new LearnRow(0, learnIndexList);schemeTable.add(learnRow);DayToTabMap.put(new Integer(i), learnRow);} else {//生成RowArrayList<Integer> learnIndexList = new ArrayList<Integer>();//遍历前面每一个计划表Row,如果存在toLearnIndex不为0 的 1 天前的,2天前的 4天前的 7 天前的 15 天前的index 则加入learnIndexListfor (int j = 1; j < i; j++) {if (DayToTabMap.get(new Integer(j)).toLearnIndex != 0 && ((i - j) == 1 || (i - j) == 2 || (i - j) == 4 || (i - j) == 7 || (i - j) == 15)) {learnIndexList.add(new Integer(j));}}LearnRow learnRow = new LearnRow(i > (this.needLearnDay + this.nowDay - 1) ? 0 : i % (this.needLearnDay + this.nowDay), learnIndexList);schemeTable.add(learnRow);DayToTabMap.put(new Integer(i), learnRow);}}} else {for (int i = this.nowDay - 1; i < this.needLearnDay + this.nowDay + 15; i++) {//生成RowArrayList<Integer> learnIndexList = new ArrayList<Integer>();//遍历前面每一个计划表Row,如果存在toLearnIndex不为0 的 1 天前的,2天前的 4天前的 7 天前的 15 天前的index 则加入learnIndexListfor (int j = 1; j < i; j++) {if (DayToTabMap.get(new Integer(j)).toLearnIndex != 0 && ((i - j) == 1 || (i - j) == 2 || (i - j) == 4 || (i - j) == 7 || (i - j) == 15)) {learnIndexList.add(new Integer(j));}}LearnRow learnRow = new LearnRow(i > (this.needLearnDay + this.nowDay - 1) ? 0 : i % (this.needLearnDay + this.nowDay), learnIndexList);schemeTable.add(learnRow);DayToTabMap.put(new Integer(i), learnRow);}}} else {log.debug("不需要重构表");}log.debug(schemeTable.toString());}}public static void main(String[] args) {Ebbinghaus ebbinghaus = new Ebbinghaus(5612);ebbinghaus.pushLearnRecord(200);ebbinghaus.pushLearnRecord(200);//验证新增学习计划单词数改变ebbinghaus.pushLearnRecord(300);ebbinghaus.pushLearnRecord(300);//验证新增学习计划单词数改变 当天没进行学习,验证动态生成计划表ebbinghaus.pushLearnRecord(0);ebbinghaus.pushLearnRecord(300);ebbinghaus.pushLearnRecord(100);}
}

最近自己鼓捣的小玩意,模仿墨墨背单词APP中的的艾宾浩斯算法动态生成复习策略类似网上这种样式的计划表(不过我实现的没有打印出来只是基于内存中的)

 不确定有什么Bug没,自己测试的比较简单


http://chatgpt.dhexx.cn/article/RZwLCi0Z.shtml

相关文章

遗忘曲线艾宾浩斯规律

艾宾浩斯遗忘曲线规律是&#xff1a;遗忘在学习之后立即开始&#xff0c;最初遗忘速度很快&#xff0c;以后逐渐缓慢&#xff0c;呈现出先快后慢的负加速趋势。遗忘的进程是不均衡的&#xff0c;遗忘的材料是先多后少。根据艾宾浩斯的实验结果&#xff0c;刚学完的时候记忆量为…

艾宾浩斯记忆法和遗忘曲线

&#xfeff;&#xfeff; 曲线实验 编辑 艾宾浩斯(Hermann Ebbinghaus&#xff0c;1850-1909)是 德国的一位著名心理学家&#xff0c;他在1885年发表了他的实验报告后&#xff1a;人们接触到的信息在经过人的学习后。艾宾浩斯曾经做了一个非常著名的实验——他选用了一些没有…

遗忘算法:算法概述

一、遗忘算法原理 能够从未知的事物中发现关联、提炼规律才是真正智能的标志&#xff0c;而遗忘正是使用智能生物具备这一能力的工具&#xff0c;也是适应变化的利器&#xff0c;“遗忘”这一颇具负能量特征的家伙是如何实现发现这么个神奇魔法的呢&#xff1f; 让我们从巴甫洛…

艾宾浩斯记忆遗忘曲线

赫尔曼•艾宾浩斯 Hermann Ebbinghaus 1850.01.24&#xff0d;1909.02.26&#xff0c;德国实验心理学家&#xff0c;实验学习心理学的创始人&#xff0c;也是最早采用实验方法研究人类高级心理过程的心理学家。 艾宾浩斯的研究方法是客观的、实验的、通过细致观察和记录可以量化…

怎样利用遗忘曲线来进行有效复习?

遗忘曲线由德国心理学家艾宾浩斯(H.Ebbinghaus)研究发现&#xff0c;描述了人类大脑对新事物遗忘的规律。人体大脑对新事物遗忘的循序渐进的直观描述&#xff0c;人们可以从遗忘曲线中掌握遗忘规律并加以利用&#xff0c;从而提升自我记忆能力。该曲线对人类记忆认知研究产生了…

基于艾宾浩斯遗忘曲线的APP(大学毕业设计)

前言 大学毕业设计项目展示 软件使用的图片素材是网上随便找的&#xff0c;比较简陋 一、登录功能实现 登录界面采用抽屉布局&#xff0c;主要控件有Toolbar、LinearLayout、TextView、GridView、Button。界面如图所示。 登录后主要工作是用户进行签到&#xff0c;查看本月共…

基于艾宾浩斯遗忘曲线的英语词汇学习微信小程序——一些思路和想法

之前想做一个利用艾宾浩斯遗忘曲线规律来背单词的小程序&#xff0c;但是不太知道这么做&#xff0c;参考查阅了很多文章&#xff0c;这里整理一下思路。 一、艾宾浩斯遗忘曲线 艾宾浩斯遗忘曲线的具体应用是利<复习点>来重复学习单词。 百度百科里面写的<复习点&g…

艾宾浩斯曲线在线 PDF 文件生成 在线背单词 背单词计划表 高考-四级-六级-SAT-托福-雅思-GRE-17 天搞定 GRE 单词, 背单词神器-动态生成时间表! 利用艾宾浩斯记忆曲线自动生成背单

[TOC](艾宾浩斯记忆曲线]计划表自动生成器 艾宾浩斯抗遗忘曲线(记忆曲线)学习计划生成器 生成艾宾浩斯记忆曲线(也叫遗忘曲线)的好东西 艾宾浩斯曲线在线 PDF 文件生成 在线背单词 背单词计划表 高考-四级-六级-SAT-托福-雅思-GRE-17 天搞定 GRE 单词, 背单词神器-动态生成时间…

遗忘的知识点

1.两个数组或者对象&#xff0c;即使里面元素都相同&#xff0c;那么这两个数组&#xff08;对象&#xff09;也不全等。因为他们的开辟空间以及地址不一样。 <script>var a [1, 0];var b [1, 0];console.log(a b);//false</script> 2.null、undefined、not d…

根据 ”艾宾浩斯遗忘曲线“复习时间点生成的复习计划模板

根据 ”艾宾浩斯遗忘曲线“复习时间点生成的复习计划模板 编程小白&#xff0c;写的可能有点乱见谅哈。 这几天一直在看学习方法之类的内容&#xff0c;加上自己在备考cpa。就经常需要记忆很多东西。突然想起来很久之前看到过的 ”艾宾浩斯遗忘曲线“。看到网上有一些根据这个…

计算机修改人类记忆曲线,遗忘曲线

遗忘曲线由德国心理学家艾宾浩斯(H.Ebbinghaus)研究发现&#xff0c;描述了人类大脑对新事物遗忘的规律。人体大脑对新事物遗忘的循序渐进的直观描述&#xff0c;人们可以从遗忘曲线中掌握遗忘规律并加以利用&#xff0c;从而提升自我记忆能力。该曲线对人类记忆认知研究产生了…

艾宾浩斯记忆遗忘曲线-背单词

复习点的确定&#xff08;根据艾宾浩斯记忆曲线制定&#xff09;&#xff1a; Joe.Smith法-背单词-复习曲线 1&#xff0e; 第一个记忆周期&#xff1a;5 mins 2&#xff0e; 第二个记忆周期&#xff1a;30 mins 3&#xff0e; 第三个记忆周期&#xff1a;12 hours 4&…

艾宾浩斯遗忘曲线-计划表30天

遗忘曲线由德国心理学家艾宾浩斯(H.Ebbinghaus)研究发现&#xff0c;描述了人类大脑对新事物遗忘的规律。人体大脑对新事物遗忘的循序渐进的直观描述&#xff0c;人们可以从遗忘曲线中掌握遗忘规律并加以利用&#xff0c;从而提升自我记忆能力。该曲线对人类记忆认知研究产生了…

学习曲线和遗忘曲线

学习曲线的定义为"在一定时间内获得的技能或知识的速率"&#xff0c;又称练习曲线&#xff08;practice curves&#xff09;。 人们为了知道学习进程中的现象和进步的快慢的详情&#xff0c;作为以后努力的指针&#xff0c;应用统计图的方法作一条线&#xff0c;把它…

浅读艾宾浩斯遗忘曲线

从网上找的一些资料显示&#xff0c; 时间间隔记忆量刚刚记忆完毕100%20分钟后58.2%1小时后44.2%8-9小时后35.8%1天后33.7%2天后27.8%6天后25.4%1个月后21.1% 遗忘的曲线和内容有关&#xff0c;也和个人有关。有很多次&#xff0c;把事情忘记&#xff0c;或者是记错&#xff0…

Mybatis-plus sql语句 LT、LE、EQ、NE、GE、GT

allEq 全部eq(或个别isNull) allEq(Map<R, V> params) allEq(Map<R, V> params, boolean null2IsNull) allEq(boolean condition, Map<R, V> params, boolean null2IsNull)例1: allEq({id:1,name:“老王”,age:null})—>id 1 and name ‘老王’ and ag…

LT6105电流检测放大器介绍

概述&#xff1a; LT6105是一款微功率&#xff0c;高精度电流检测放大器&#xff0c;具有非常宽的输入共模范围。 LT6105通过外部检测电阻上的电压监测单向电流。输入通用相对于负电源电压&#xff08;V-&#xff09;&#xff0c;模式范围从-0.3V延伸至44V。这使得LT6105可以用…

LinuxShell脚本比较运算符, -gt, -lt; > < 的区别

今天写centos脚本的时候,遇到了一个问题, 条件不是按照我预设的方向。卧槽。蒙了都。 原始代码如下&#xff1a; #!/bin/bash # 定义 a 1111 a1111# 如果 a 大于 999 则打印 "大于"; 操蛋的是这里并不会打印 if [[ ${a} > 999 ]]; thenecho "大于" f…

Linux下lt8911exb调试总结

调试lt8911exb花了两天时间&#xff0c;总结下 ic功能介绍:mipi转eDP http://cn.lontiumsemi.com/UploadFiles/pdf/LT8911EXB_Product_Brief.pdf github下有驱动源码&#xff0c;可以直接使用(mipi配置的是burst模式) https://github.com/aystshen/lontium_lt8911exb_driver…