package com.xkl.cdl.util import com.xkl.cdl.data.bean.BaseWord /** * author suliang * create 2022/4/22 17:12 * Describe: 规则 * @property originList 源数据 * @property cycleTime 循环次数 */ class LearnRuleUtil(private val originList : List, private val cycleTime : Int) { //源数据学习位置 private var originLearnPosition : Int = 0 //学习列表位置 private var currentLearnPosition : Int = -1 //学习列表数据 private var currentList = mutableListOf(null) //当前答题是否错误 private var currentIsError = false //学前总和课时前测试错误集合 var examErrorMap = hashMapOf() //新错误集合 var newErrorMap = hashMapOf() //第一次点击正确的集合, 如果后面再点击错误,需要移除并添加到错误集合中 var newCorrectMap = hashMapOf() fun getNext(): T? { if (currentIsError || isHaveNext()){ return nextWord() } return null } /** * 是否还有下一单词 * @return Boolean */ private fun isHaveNext():Boolean{ //如果当前学习下标为-1,即第一次进入学习,直接返true if (currentLearnPosition == -1) return true //元数据是否学习完成,未学习完成,则还有学习数据, 元数据学习完成,还需要判断当前学习列表是否学习完成 if (!isLearnOverForOrigin()) return true //判断当前列表是否学习完成 val currentLearnWord = currentList[currentLearnPosition]!! var nextWord: T? = null //循环找寻与当前word不一样的数据 if (currentLearnPosition + 1 < currentList.size-1) { for (i in currentLearnPosition + 1 .. currentList.size - 1) { currentList[i]?.let { if (currentLearnWord.wordId != it.wordId ){ nextWord = it } } if (nextWord != null) break } } //如果获取不到下一个不为空的数据,则还有下一条,否则结束了 return nextWord != null } /** * 源数据是否学习完成 */ fun isLearnOverForOrigin():Boolean{ return originLearnPosition >= originList.size -1 } /** * 获取下一条数据 */ private fun nextWord(): T?{ //声明下一条数据 var next : T? = null //当前列表 学习位置+1 currentLearnPosition ++ when{ //从当前集合获取 currentList.size > currentLearnPosition -> { } //从源数据据列表获取 else -> { originLearnPosition++ if (!isLearnOverForOrigin()) { next = originList[originLearnPosition] //元数据如果是课时学前或总测的错误数据,那么就需要按照小循环插入 } } } return next } /** 是否在错误列表中 */ }