sub_compare.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package sub_timeline_fixer
  2. type SubCompare struct {
  3. baseIndexDict map[int]int
  4. srcIndexDict map[int]int
  5. baseIndexList []int
  6. srcIndexList []int
  7. maxCompareDialogue int
  8. baseNowIndex int
  9. srcNowIndex int
  10. }
  11. func NewSubCompare(maxCompareDialogue int) *SubCompare {
  12. sc := SubCompare{
  13. baseIndexDict: make(map[int]int, 0),
  14. srcIndexDict: make(map[int]int, 0),
  15. baseIndexList: make([]int, 0),
  16. srcIndexList: make([]int, 0),
  17. maxCompareDialogue: maxCompareDialogue,
  18. baseNowIndex: -1,
  19. srcNowIndex: -1,
  20. }
  21. return &sc
  22. }
  23. // Add 添加元素进来比较
  24. func (s *SubCompare) Add(baseNowIndex, srcNowIndex int) bool {
  25. // 如果是第一次 Add 的话,就直接把后续需要匹配的 Index 字典的 Key 信息建立好
  26. // 再次调用本方法的时候就是 check 是否需要加的 key 存在于 字典 Key 中即可
  27. if len(s.baseIndexDict) == 0 {
  28. // 第一次
  29. for i := 0; i < s.maxCompareDialogue; i++ {
  30. s.baseIndexDict[baseNowIndex+i] = i
  31. s.srcIndexDict[srcNowIndex+i] = i
  32. s.baseIndexList = append(s.baseIndexList, baseNowIndex+i)
  33. s.srcIndexList = append(s.srcIndexList, srcNowIndex+i)
  34. }
  35. s.baseNowIndex = baseNowIndex
  36. s.srcNowIndex = srcNowIndex
  37. }
  38. // 可以理解为第二次开始才进入这个逻辑
  39. // 判断是否是预计的顺序 Index
  40. _, okBase := s.baseIndexDict[baseNowIndex]
  41. _, okSrc := s.srcIndexDict[srcNowIndex]
  42. if okBase == false || okSrc == false {
  43. // 一定要存在,因为必须是可期待的 Index
  44. return false
  45. }
  46. // 上面的判断仅仅是确定这个 index 是期望的范围内的,而不能保证顺序
  47. // 需要在这里没进行一次判断成功后,这里需要判断进入顺序判断的逻辑
  48. if s.baseIndexList[0] != baseNowIndex || s.srcIndexList[0] != srcNowIndex {
  49. return false
  50. }
  51. // 移除数组的首个元素
  52. s.baseIndexList = s.baseIndexList[1:]
  53. s.srcIndexList = s.srcIndexList[1:]
  54. return true
  55. }
  56. // Check 是否 Add 的元素已经足够满足 maxCompareDialogue 的数量要求了
  57. func (s *SubCompare) Check() bool {
  58. if len(s.baseIndexList) == 0 && len(s.srcIndexList) == 0 {
  59. return true
  60. } else {
  61. return false
  62. }
  63. }
  64. func (s *SubCompare) Clear() {
  65. s.baseIndexDict = make(map[int]int, 0)
  66. s.srcIndexDict = make(map[int]int, 0)
  67. s.baseIndexList = make([]int, 0)
  68. s.srcIndexList = make([]int, 0)
  69. s.baseNowIndex = -1
  70. s.srcNowIndex = -1
  71. }
  72. func (s *SubCompare) GetStartIndex() (int, int) {
  73. return s.baseNowIndex, s.srcNowIndex
  74. }