学考乐离线App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LearnRuleUtil.kt 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package com.xkl.cdl.util
  2. import com.xkl.cdl.data.bean.BaseWord
  3. /**
  4. * author suliang
  5. * create 2022/4/22 17:12
  6. * Describe: 规则
  7. * @property originList 源数据
  8. * @property cycleTime 循环次数
  9. */
  10. class LearnRuleUtil<T : BaseWord>(private val originList : List<T>, private val cycleTime : Int) {
  11. //源数据学习位置
  12. private var originLearnPosition : Int = 0
  13. //学习列表位置
  14. private var currentLearnPosition : Int = -1
  15. //学习列表数据
  16. private var currentList = mutableListOf<T?>(null)
  17. //当前答题是否错误
  18. private var currentIsError = false
  19. //学前总和课时前测试错误集合
  20. var examErrorMap = hashMapOf<String,Boolean>()
  21. //新错误集合
  22. var newErrorMap = hashMapOf<String,Boolean>()
  23. //第一次点击正确的集合, 如果后面再点击错误,需要移除并添加到错误集合中
  24. var newCorrectMap = hashMapOf<String,Boolean>()
  25. fun getNext(): T? {
  26. if (currentIsError || isHaveNext()){
  27. return nextWord()
  28. }
  29. return null
  30. }
  31. /**
  32. * 是否还有下一单词
  33. * @return Boolean
  34. */
  35. private fun isHaveNext():Boolean{
  36. //如果当前学习下标为-1,即第一次进入学习,直接返true
  37. if (currentLearnPosition == -1) return true
  38. //元数据是否学习完成,未学习完成,则还有学习数据, 元数据学习完成,还需要判断当前学习列表是否学习完成
  39. if (!isLearnOverForOrigin()) return true
  40. //判断当前列表是否学习完成
  41. val currentLearnWord = currentList[currentLearnPosition]!!
  42. var nextWord: T? = null
  43. //循环找寻与当前word不一样的数据
  44. if (currentLearnPosition + 1 < currentList.size-1) {
  45. for (i in currentLearnPosition + 1 .. currentList.size - 1) {
  46. currentList[i]?.let {
  47. if (currentLearnWord.wordId != it.wordId ){
  48. nextWord = it
  49. }
  50. }
  51. if (nextWord != null) break
  52. }
  53. }
  54. //如果获取不到下一个不为空的数据,则还有下一条,否则结束了
  55. return nextWord != null
  56. }
  57. /**
  58. * 源数据是否学习完成
  59. */
  60. fun isLearnOverForOrigin():Boolean{
  61. return originLearnPosition >= originList.size -1
  62. }
  63. /**
  64. * 获取下一条数据
  65. */
  66. private fun nextWord(): T?{
  67. //声明下一条数据
  68. var next : T? = null
  69. //当前列表 学习位置+1
  70. currentLearnPosition ++
  71. when{
  72. //从当前集合获取
  73. currentList.size > currentLearnPosition -> {
  74. }
  75. //从源数据据列表获取
  76. else -> {
  77. originLearnPosition++
  78. if (!isLearnOverForOrigin()) {
  79. next = originList[originLearnPosition]
  80. //元数据如果是课时学前或总测的错误数据,那么就需要按照小循环插入
  81. }
  82. }
  83. }
  84. return next
  85. }
  86. /** 是否在错误列表中 */
  87. }